Командная строка способ слить многоканальный аудио .Mov в одноканальный аудио .Mov?

329
M. Scott Ford

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

Я использую регистратор звонков ecamm для Skype . Он записывает в файл QuickTime MOV с двумя аудиопотоками. Один - это звук, записанный с микрофона, а другой - звук, записанный с динамиков. Они предоставляют инструмент под названием «Преобразовать в Интернет», который поставляется вместе с дистрибутивом Movie Tools .

Каждую неделю я записываю собрание, и я ищу способ автоматизировать процесс «объединения» этих аудиопотоков в один поток, чтобы я мог поделиться с другими. Приложение «Преобразовать в Интернет» поддерживает преобразование только одного файла за раз, и это приложение с графическим интерфейсом, которое работает путем перетаскивания файла для преобразования в главное окно приложения.

Я хотел бы найти способ достичь того же конечного результата, который получает приложение «Преобразовать в Интернет», но используя что-то, что я запускаю в командной строке (предпочтительно из коробки Linux, которую я могу раскрутить, чтобы выполнить работу и затем поверните вниз, когда это будет сделано).

Я думаю, что руководство по продукту довольно хорошо объясняет процесс, который должен произойти. В том случае, если мой бродит здесь не все так ясно.

Я копался в документации для FFmpeg, которая, я думаю, будет лучшим кандидатом для этого. Я нашел amergeфильтр, но документы заставляют его звучать так, как будто он просто выдаст мне один аудиопоток с 4 каналами (слева и справа от первого потока и слева и справа от второго потока). Поскольку это не то, что я хочу, я посмотрел на amixфильтр, но, похоже, он работает с потоками из разных входных файлов, а не с несколькими потоками из одного файла.

Любая помощь, направленная в правильном направлении, очень ценится.

Редактировать:

Я подумал, что вывод ffprobeфайла, с которым я работаю, также может быть полезен.

$ ffprobe input.mov ffprobe version 2.8.3 Copyright (c) 2007-2015 the FFmpeg developers built with Apple LLVM version 7.0.0 (clang-700.1.76) configuration: --prefix=/usr/local/Cellar/ffmpeg/2.8.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libvo-aacenc --enable-libxvid --enable-vda libavutil 54. 31.100 / 54. 31.100 libavcodec 56. 60.100 / 56. 60.100 libavformat 56. 40.101 / 56. 40.101 libavdevice 56. 4.100 / 56. 4.100 libavfilter 5. 40.101 / 5. 40.101 libavresample 2. 1. 0 / 2. 1. 0 libswscale 3. 1.101 / 3. 1.101 libswresample 1. 2.101 / 1. 2.101 libpostproc 53. 3.100 / 53. 3.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mov': Metadata: major_brand : qt  minor_version : 537199360 compatible_brands: qt  creation_time : 2015-09-18 17:04:00 Duration: 01:07:51.64, start: 0.000000, bitrate: 1503 kb/s Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 43 kb/s (default) Metadata: creation_time : 2015-09-18 17:04:00 handler_name : Apple Alias Data Handler Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default) Metadata: creation_time : 2015-09-18 17:04:00 handler_name : Apple Alias Data Handler Stream #0:2(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1381 kb/s, SAR 1:1 DAR 16:9, 19.63 fps, 14.42 tbr, 1k tbn, 50 tbc (default) Metadata: creation_time : 2015-09-18 17:04:00 handler_name : Apple Alias Data Handler encoder : H.264 
2

2 ответа на вопрос

2
LordNeckbeard

Use amerge then downmix it with -ac:

ffmpeg -i input -filter_complex "[0:a:0][0:a:1]amerge=inputs=2[a]" \ -map 0:v -map "[a]" -c:v copy -ac 1 output 

Also see FFmpeg Wiki: Audio Channel Manipulation.

Спасибо! Примерно через час или около того после того, как я отправил этот вопрос, я продолжал возиться с amix и заставил его работать (и я опубликую его как другой ответ). Но я решил попробовать, чтобы увидеть, какой подход лучше. Ваш работал намного быстрее (около минуты), но выходной файл оказался больше оригинала. С входным файлом 730M я получил выходной файл 735M с вашим подходом. С другим я получил файл 468M, но это заняло около 15 минут. M. Scott Ford 8 лет назад 0
Ах! Похоже, причина, по которой моя команда привела к уменьшению размера файла и увеличению времени выполнения, была в том, что она перекодировала видео, а ваша просто делала копию. Отмечая ваш как правильный ответ. Спасибо! M. Scott Ford 8 лет назад 0
@ M.ScottFord Копируется только видеопоток, а аудио перекодируется (для фильтрации требуется кодирование). Я просто сделал некоторые предположения относительно вашего ввода и `ffmpeg` сборки, потому что в то время не было никакого вывода консоли. libvo-aac отстой, поэтому вы должны добавить `-c: aac -strict -2`, чтобы вместо этого использовать собственный кодер AAC, хотя ваша сборка старая и не имеет последних обновлений AAC (вам придется использовать сборку от текущего git master, чтобы воспользоваться этим: см. [статические сборки] (http://evermeet.cx/ffmpeg/)). LordNeckbeard 8 лет назад 0
Я получаю сообщение об ошибке: «Невозможно найти подходящий выходной формат для« -map »-map: Неверный аргумент` Arthur 7 лет назад 0
@Arthur Пожалуйста, используйте сайт pastebin, чтобы показать вашу фактическую команду и полный вывод. Затем укажите ссылку в комментарии. LordNeckbeard 7 лет назад 0
0
M. Scott Ford

After fiddling around and doing more searching, I came up with the following command which appears to work.

ffmpeg -i input.mov -filter_complex "[0:0][0:1] amix=inputs=2[audio]" \ -map a output.mov 

It took much longer to run than the answer posted by LordNeckbeard, but it resulted in a smaller file. So I guess I now have to decide which I value more, time or (storage) space.