2016-12-02 1 views
1

У меня есть много файлов с несколькими языками аудио и субтитров, однако номера дорожек не согласованы (английский аудиопоток не всегда является первым), поэтому используйте команду, такую ​​как:Отображение потоков по языкам в FFmpeg

ffmpeg -i "input.mkv" -map 0 -map -0:a:1 -c:v copy -c:a copy "output.mkv" 

не дает ожидаемых результатов. После поиска вокруг я обнаружил, что это можно было сопоставить потоки на основе языка с помощью этой команды:

ffmpeg -i "input.mkv" -map 0 -map -0:m:language:eng -c:v copy -c:a copy "output.mkv" 

Однако -map -0:m:language:eng удалит все дорожки с флагом на английском языке. Чтобы сохранить дорожки субтитров, вы можете использовать -map 0:s, но это хорошее решение, но я хочу знать, можно ли только отображать аудиопотоки на основе языка.

ответ

0

Обновленного Насколько я могу сказать, что это лучший способ, чтобы удалить английское аудио, сохраняя при этом всех других потоках без использования идентификаторов потоков, которые я считаю более противоречивыми, чем языковые флаги. Как правило, люди используют правильные языковые флаги, однако языки с более низким разрешением сохраняют один и тот же идентификатор.

ffmpeg -i "in.mkv" -map a -map -m:language:eng -map v -map s -map d? -map t -c:v copy -c:a copy "out.mkv"

Команда будет отображать каждый аудиопоток затем удалить аудио с флагом на English языке. Затем он отобразит все потоки видео, субтитров и вложений. Вы можете добавить -disposition:a:0 default, чтобы дать первому аудиопотоку флаг [по умолчанию], если это необходимо. Примечание. Используйте только при удалении звука, который уже имеет флаг по умолчанию. Измените -disposition:a:0 на -disposition:a:1 и так далее, если вы хотите установить другую звуковую дорожку по умолчанию.

+0

Эта команда дублирует потоки видеопотока * и неанглийские субтитры. * если видео не отмечено как английский, которого обычно нет. Мое обходное решение позволяет избежать этого. – Mulvya

+0

Хм, ваше решение не будет отображать вложения, но как вы это делаете, не используя -map 0 или не давая идентификатор каждого отдельного потока вложений? Первая работа над вами создала временный файл, который заставлял процесс занимать больше времени. Кроме того, если вы не используете '-map 0: v' после удаления английских потоков, не удаляется ли видео, если у него есть английский флаг? ? – ffmpeg123

+0

Модифицированное обходное решение для хранения данных и потоков вложений. Ваша первоначальная цель, IIRC, заключалась в удалении только аудиопотоков на английском языке. Мое обходное решение делает это и пропускает все остальное. – Mulvya

2

Редактировать: Игнорировать первоначальный ответ. В настоящее время невозможно. Используйте обходной путь сверху.

ffmpeg -i "in.mkv" -map 0:a -map -0:m:language:eng -map 0:v -map 0:s -map 0:d? -map 0:t? -c copy "out.mkv" 

Это обеспечивает желаемый результат, поскольку ffmpeg реализует параметры карты в заданном порядке.


Вы должны суффиксами селекторов метаданных для селектора типа потока т.е.

ffmpeg.exe -i "%f" -map 0 -map -0:a:m:language:eng -c:v copy -c:a copy "../%f" 
+0

Сначала это работало, но я испытываю некоторые проблемы. В моем видео есть две звуковые дорожки # 0 Английский # 1 Японский звук - ogg vorbis, и им нужно исправить языковые флаги. Выполнение команды выше выводит файл только с английским звуком. Даже если я попробую изменить -0: a: m: language: eng to -0: a: m: language: jpn Я получаю те же результаты. Кажется, он просто удаляет второй трек независимо от того, что я делаю. – ffmpeg123

+0

Это работает, но не очень просто: ffmpeg -i "input, mkv" -map 0: v -map 0: s -map 0: a: m: language: jpn -c: v copy -c: a copy " output.mkv «Я не понимаю, почему» -map 0 -map -0: a: m: language: eng «не работает, когда« -map 0 -map -0: m: language: eng »делает. – ffmpeg123

+0

Искренне, ни мой ответ, ни ваше обходное решение не работают.Ваш метод обхода «работает», потому что ffmpeg оценивает «-map 0: a: m: language: jpn' as» -map 0: a: 1', который в вашем случае является аудио jpn. В настоящее время это невозможно, но я заменил свой ответ обходным решением. – Mulvya

0

-0: m: язык: eng удалит английские звуковые дорожки и сохранит все остальные.

Чтобы сохранить только английские звуковые дорожки и удалить все остальные, удалите тире в начале: 0: m: язык: eng черта в начале создает отрицательное отображение, которое сообщает ffmpeg «удалить это и только то, что матч это «

Я знаю, что это через 8 месяцев, но я думал, что это будет полезно для тех, кто в конечном итоге оказался вне поисковых запросов Google, как я.