Ответы:
Сначала запустите, ffmpeg -i file.mp4
чтобы увидеть, какие потоки существуют в вашем файле. Вы должны увидеть что-то вроде этого:
Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Stream #0.2: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Затем запустите, ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4
чтобы скопировать видеопоток и второй аудиопоток в new_file.mp4
.
Option map (set input stream mapping) cannot be applied to input file file.mp4 new_file.mp4 -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
: чтобы исправить ее, просто измените порядок аргументов следующим образом:ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4
-c copy
чтобы иметь одинаковые потоки для аудио, видео , но и субтитры: ffmpeg -i input.mp4 -map 0:0 -map 0:2 -c copy output.mp4
.
Связанная проблема - удаление всех звуковых дорожек из файла mp4 может быть сделано следующим образом:
ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4
The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.
Но я добавил эти флаги, и это все тот же ...?
Определить номера потоков:
$ ffmpeg -i in.mp4
...
Stream #0:0: Video: ...
Stream #0:1: Audio: ...
Stream #0:2: Audio: ...
Используйте -map _file_:_stream_
для выбора потоков для обработки и вывода
$ ffmpeg -i in.mp4 -map 0:0 -map 0:2 -vcodec copy -acodec copy out.mp4
Вы можете попробовать, avidemux
который обрабатывает только один аудиофайл внутри (и, следовательно, заставляет вас выбрать одну конкретную дорожку). Я никогда не пробовал с .mp4, но он работает с другими форматами.
Я использовал Avidemux (GUI) несколько раз и ffmpeg (консоль).
В Avidemux вы выбираете «Аудио» -> «Выбрать треки» в главном меню; затем сохраните ваше видео как новый файл.
Интересно, что в некоторых случаях Avidemux выдает «лучший» вывод, чем ffmpeg
на всякий случай Avidemux и ffmpeg находятся в стандартном репозитории Fedora Linux. (Я уверен, что они стандартны и в других версиях Linux).
-vn
или -an
удалит все видео или аудио дорожки. Поставка -vn -acodec copy
удалит видео; -an -vcodec copy
удалит все аудио
-vcodec copy
указывает, что ffmpeg должен делать прямое копирование существующей видеодорожки (а не обрабатывать / кодировать ее). Если вы не укажете его, он все равно будет работать, но ffmpeg может перекодировать существующую видеодорожку, и операция будет использовать больше ресурсов процессора и может занять значительно больше времени.
Использование avidemux в командной строке.
(В графическом интерфейсе Avidemux, как описано в https://unix.stackexchange.com/a/85834/4319 выше, вы просто выбираете / отменяете выбор звуковых дорожек и сохраняете файл. (Все копируется в новый AVI.))
Я посмотрел, какие проекты сохраняются в виде проектов SpiderMonkey или TinyPy для моих действий, и выяснилось, что в проекте SpiderMonkey (JavaScript) отсутствуют нужные мне действия по выбору звуковой дорожки, но проект TinyPy (Python) действительно имел их.
Я удалил все несвязанные (дюжина ненужных строк), и вот что я получил в своем some_series.py
:
#PY <- Needed to identify #
#--automatically built--
adm = Avidemux()
adm.audioClearTracks()
adm.audioAddTrack(1)
Он покидает дорожку 1, но отбрасывает дорожку 0.
Затем я запустил пакетное преобразование многих файлов с помощью команды, подобной этой:
for f in *.avi; do avidemux3_cli --nogui --load "$f" --run ../some_series.py --save ../some_series/"${f%%.rus.eng.avi}".eng.avi --quit; done
Копирует все, но сбрасывает все, кроме необходимой звуковой дорожки.
Способ запуска avidemux из командной строки был изучен мной по адресу https://www.avidemux.org/admWiki/doku.php?id=tutorial:batch_processing , хотя они не упоминают скрипты Python, только скрипты JS ( который не работал для меня).
ffmpeg
Программа была заменена avconv
. avconv
имеет очень похожее использование ffmpeg
, поэтому все команды в этом посте могут быть примерно такими:
avconv <old ffpmeg command line options>
Перейдите по этой ссылке, чтобы установить, avconv
если вы находитесь на Ubuntu.
FFMPEG может быть полезным решением для вас.
$ man ffmpeg