Как удалить звуковую дорожку из видео файла mp4?

97

У меня есть MP4 видео файл с несколькими звуковыми дорожками. Я хотел бы убрать остальные треки и оставить только один. Как мне это сделать?

tshepang
источник
связанные: stackoverflow.com/questions/38161697/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

111

Сначала запустите, 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.

gelraen
источник
3
В Windows эта команда выдала ошибку 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
MrLore
Та же ошибка, что и @MrLore на OS X.
Оскар Перссон
1
То же самое на Ubuntu!
Томмазо
Работает и для формата MKV
user3405291
1
Вы можете использовать более общий вариант , -c copyчтобы иметь одинаковые потоки для аудио, видео , но и субтитры: ffmpeg -i input.mp4 -map 0:0 -map 0:2 -c copy output.mp4.
Futal
97

Связанная проблема - удаление всех звуковых дорожек из файла mp4 может быть сделано следующим образом:

ffmpeg -i input_file.mp4 -vcodec copy -an output_file.mp4
Грег Маркс
источник
1
Это дает мне ошибку The encoder 'aac' is experimental but experimental codecs are not enabled, add '-strict -2' if you want to use it.Но я добавил эти флаги, и это все тот же ...?
пошагнесси
См. Также: superuser.com/questions/268985/…
Сиро Сантилли 事件 改造 中16 iro 六四 事件
Re poshaughnessy комментарий: кажется, здесь есть некоторая информация: stackoverflow.com/questions/32931685/… Обсуждение предполагает, что последние версии ffmpeg не испытывают «экспериментальную» проблему. Как правило, это помогает диагностировать вашу проблему, если вы укажете версию используемого вами программного обеспечения и точный синтаксис команды (после добавления флагов), которая вызвала ошибку (см. Ответ freeseek loc. Cit. ). В этом конкретном случае видеоинформация из входного файла также может быть полезна.
Грег Маркс
8

Определить номера потоков:

$ 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

см .: https://ffmpeg.org/ffmpeg.html#Advanced-options

JGR
источник
4

Вы можете попробовать, avidemuxкоторый обрабатывает только один аудиофайл внутри (и, следовательно, заставляет вас выбрать одну конкретную дорожку). Я никогда не пробовал с .mp4, но он работает с другими форматами.

шутник
источник
Не очень хорошо работает. Может быть, это ошибка, но звук возвращается искаженным, хотя и выполняет свою работу (удалите оставшиеся звуковые дорожки).
tshepang
3

Я использовал Avidemux (GUI) несколько раз и ffmpeg (консоль).

В Avidemux вы выбираете «Аудио» -> «Выбрать треки» в главном меню; затем сохраните ваше видео как новый файл.

Интересно, что в некоторых случаях Avidemux выдает «лучший» вывод, чем ffmpeg

на всякий случай Avidemux и ffmpeg находятся в стандартном репозитории Fedora Linux. (Я уверен, что они стандартны и в других версиях Linux).

Максим
источник
1

-vnили -anудалит все видео или аудио дорожки. Поставка -vn -acodec copyудалит видео; -an -vcodec copyудалит все аудио

-vcodec copyуказывает, что ffmpeg должен делать прямое копирование существующей видеодорожки (а не обрабатывать / кодировать ее). Если вы не укажете его, он все равно будет работать, но ffmpeg может перекодировать существующую видеодорожку, и операция будет использовать больше ресурсов процессора и может занять значительно больше времени.

много чипсов
источник
0

Использование 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 ( который не работал для меня).

imz - Иван Захарящев
источник
-1

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

YoMismo
источник
-2

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

avconv <old ffpmeg command line options>

Перейдите по этой ссылке, чтобы установить, avconvесли вы находитесь на Ubuntu.

SmallChess
источник
-3

FFMPEG может быть полезным решением для вас.

$ man ffmpeg
koolhead17
источник
У меня был краткий взгляд, и он довольно плотный. Я искал "аудио" и "аудио трек", и ничего не казалось очевидным.
Чепанг
@Tshepang, «дорожка» неоднозначна, поэтому, вероятно, FFmpeg предпочитает более точную терминологию. FFmpeg считает, что звук поступает в виде «потоков», каждый из которых содержит один или несколько «каналов». AFAICT, каждый канал монофонический, с потоком, описывающим, какие выходные данные ему следует отправлять (панорамировать) по умолчанию. Например, стереопоток состоит из двух каналов: один по умолчанию отправляется на левый выход звуковой карты, а другой по умолчанию - на правый выход звуковой карты.
Сампаблокупер