Правильно микшировать 5.1 в стерео с помощью ffmpeg

27

У меня есть аудиодорожка 5.1 из фильма, в которой передний левый и правый передний содержат музыку, а центральный содержит диалог. Воспроизведение дорожки 5.1 в VLC прекрасно сочетает все вместе.

Я пытаюсь преобразовать дорожку 5.1 в стерео с использованием ffmpeg -ac 2, однако получаемый стерео микс имеет гораздо более слабую громкость, чем естественное воспроизведение дорожки 5.1.

Добавление -af "pan=stereo|c0=FL|c1=FR"дает правильную громкость, но тогда нет диалога, потому что центральный канал не включен.

Таким образом, решение может заключаться в том, чтобы смешать левый / центральный / правый стерео и выбросить внутренние каналы сабвуфера? (Я думаю, здесь ...)

Итак, вопрос: как мне сделать ffmpeg downmix 5.1 для стерео так же, как это делает VLC, с такой же сильной громкостью в конечном результате?

forthrin
источник
Вы уверены, что VLC действительно воспроизводит дополнительные каналы? Микширование с понижением может привести к нормализации, так что сумма каждого входа на выходной канал не приводит к перегрузке, поэтому ограничение не допускается. Это может сделать это звучит тише.
llogan
Основы: Мой файл 5.1. Мои динамики стерео. Я не знаю, что делает VLC, но он создает отличный конечный результат в моих стереодинамиках из исходных данных 5.1 (сильная громкость, включая музыку и диалоги). ffmpeg, с другой стороны, создает результат «низкая громкость» при использовании -ac 2. Поэтому я спрашиваю, как заставить ffmpeg генерировать такой же хороший результат, как VLC.
forthrin

Ответы:

29

Я нашел ответ, предоставленный Шейном, чтобы предоставить слишком мало других каналов и слишком много центра. Фильмы с наушниками звучали несбалансированно, со всеми диалогами и отсутствием фоновой музыки / эффектов.

В соответствии со стандартами ATSC (раздел 7.8, стр. 91), следующая формула используется для понижающего микширования 5.1 в обычное стерео (в отличие от матрицы):

Lo = 1.0 * L + clev * C + slev * Ls ;
Ro = 1.0 * R + clev * C + slev * Rs ;

clev и slev должны быть 0,707, в соответствии с таблицами 5.9 и 5.10 в вышеупомянутом документе, предполагая, что уровень микширования центра / объемного звучания равен 0. Другие значения приведены в тех таблицах, которые уменьшают количество микса центра, который я не нахожу полезно.

Имея это в виду, следующая опция ffmpeg создает хороший сбалансированный звук со слышимым диалогом. Обратите внимание, что указывать аудиоканалы не обязательно.

-af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR"

Примечание об использовании символа «меньше» из документации по фильтру панорамирования :

Если '=' в спецификации канала заменяется на '<', тогда усиления для этой спецификации будут перенормированы, так что общее значение будет равно 1, что позволит избежать шума отсечения.

Грегори
источник
5
Стандарты ATSC, на которые вы ссылались здесь, были связаны с вики FFmpeg по этой теме , поэтому неудивительно, что используемая здесь формула является той же самой формулой, реализованной FFmpeg с ее ac -2переключателем. Другими словами, единственное различие между использованием этого фильтра и выполнением ac -2- намного больше печатания.
Хашим
@Hashim Не только печатать. Ответ с подробным объяснением основ объективно лучше, чем «напиши это, чтобы получить это».
Севастян Саванюк
18

С тех пор ответы на этот вопрос стали немного беспорядочными, многие из которых содержат избыточную информацию, а другие - полные неточности. Этот ответ является попыткой упорядочить информацию в этих ответах, устраняя при этом проблемы в них.

Самое главное, стоит иметь в виду, что ответ Грегори, в настоящее время получивший наибольшее количество голосов на этот вопрос, ничем не отличается от использования -ac 2переключателя - подробнее об этом ниже.

Микширование 5.1-канального аудиопотока в стерео -ac 2

FFmpeg поставляется со встроенными возможностями для микширования дорожки 5.1 в стерео, и это также решение, которое рекомендует собственная документация FFmpeg :

Примечание: ffmpeg интегрирует стандартную систему понижающего микширования (и повышающего микширования), которая должна быть предпочтительнее ( -acопция), чем пан-фильтр, если у вас нет особых потребностей.

-ac 2Переключатель работает путем смешивания пропорции первых 5 каналов из потока 6-канального источника сигналов - задний левый, задний правый, передний левый, передний правый и передний центр - в каналы Передний левый и передний правый в выходной стерео поток:

введите описание изображения здесь

При этом аудио из канала LFE ( .1 в 5.1, зарезервированное для сабвуфера и используемое для глубоких низкочастотных эффектов) полностью удаляется при использовании этой опции.

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


Чтобы микшировать дорожку DTS -ac 2 без перекодирования (то есть, чтобы сохранить кодек и расширение одинаковыми):

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 "stereotrack.dts"

Как отметил Мефисто в своем ответе, если диалог и музыка кажутся вам хорошо сбалансированными друг с другом, но вам просто не хватает громкости, вы можете микшировать поток, одновременно увеличивая его громкость:

ffmpeg -i "sourcetrack.dts" -c:a dca -ac 2 -vol 425 "stereotrack.dts"

Для -volкоммутатора 100% громкость в источнике эквивалентна целочисленному значению 256, и использование большего значения, чем это, увеличит общую громкость аудиопотока. Тем не менее, обратите внимание, что выполнение этого слишком много может привести к искажению или артефактам, особенно во время его более громких секций.

Для понижающего микширования аудиопотока в стерео и транскодирования его в кодек AC3, например:

ffmpeg -i "sourcetrack.dts" -c:a ac3 -ac 2 "stereotrack.ac3"

Микширование 5.1-канального аудиопотока в стерео с помощью специального алгоритма микширования

Если вы хотите более качественное микширование с понижением или вы обязательно должны включить поток LFE в свой выход, вы можете использовать переключатель аудиофильтра FFmpeg ( -af) для микширования звука с использованием пользовательской формулы микширования.

Смешивание с формулой ATSC (ответ Грегори)

На момент публикации этого ответа самым популярным ответом на этот вопрос был Грегори , который помещает формулу из спецификации ATSC (см. Раздел 7.8.2, « Микширование в два канала» ) в аудиофильтр FFmpeg. Эта спецификация непосредственно связана с документацией FFmpeg по этой теме , указывая на то , что она, скорее всего, будет той же самой формулой, которую FFmpeg уже реализует для своего -ac 2переключателя. Если это правда, то вывод всей формулы в ответе Грегори ничем не отличается от использования -ac 2переключателя, и, следовательно, трата времени.

Я решил проверить это наверняка, перекодировав одно и то же входное аудио с использованием обоих -ac 2и -afфильтра из ответа Грегори (точные используемые команды можно увидеть в сносках к этому ответу).

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

введите описание изображения здесь

Наконец, я открыл оба выходных файла в Audacity и сравнил их формы сигналов, чтобы убедиться, что они идентичны (нажмите, чтобы увеличить):

введите описание изображения здесь

Поэтому кажется довольно убедительным, что формула ATSC, подробно описанная в ответе Грегори, является той же самой формулой, которая уже реализована в FFmpeg , и что ее использование полностью избыточно, когда ничего не -ac 2делает, и является гораздо более громоздкой командой.

Микширование без отбрасывания канала LFE (ответ Dave_750)

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

Общий уровень громкости выше и полнее, чем у вас -ac 2, но также и ниже, чем у нижестоящего понижающего микширования Nightmode Dialogue. Однако уровни музыки намного ближе к источнику, чем понижающее микширование Nightmode Dialogue, и из-за включения дорожки LFE увеличение громкости вывода при использовании этой формулы понижающего микширования может создать выходной поток, который звучит более правдоподобно для источника 5.1, чем все остальные формулы, которые я проверял.

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

Чтобы микшировать дорожку 5.1 в стерео с помощью этой формулы и увеличить ее уровень громкости до 425 (где 256 - это 100% от уровня громкости исходного источника):

ffmpeg -i "sourcetrack.dts" -c dca -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "outputstereo.dts"

Смешивание с диалогом Роберта Кольера в ночном режиме (ответ Шейна Харрельсона)

Формула Nightmode Dialogue, созданная Робертом Коллиером на форуме Doom9 и полученная от Шейна Харрельсона в его ответе, приводит к гораздо лучшему микшированию, чем к -ac 2переключателю - вместо чрезмерно тихих диалогов она возвращает их к уровням, которые гораздо ближе к источник.

Из описания микса Роберта Кольера:

После преобразования многих дорожек фильмов DTS из 5.1 в 2.0 с использованием eac3to я обнаружил, что сопоставления каналов eac3to по умолчанию приводят к очень тихим диалогам и чрезмерно громкой музыке и сценам действий. Хотя коэффициенты понижающего микширования канала eac3to имеют научную основу, на практике они часто звучат не очень хорошо из-за низкой громкости диалога. Эта предустановка предназначена для тех, кто ищет четкие диалоги, в которых музыка левого и правого каналов все еще слышна, но больше на заднем плане.

Как вы можете видеть - фронтальный центр (диалоги) теперь правильно входит и остается на исходном уровне - в то время как музыка и взрывы остаются фоновым эффектом и не подавляют вас. Этот пресет решает проблему того, что вам приходится постоянно играть с ручкой регулировки громкости при просмотре DTS 5.1, преобразованного в фильмы 2.0, для прослушивания диалогов. (Особенно для просмотра фильмов ночью, когда вы не хотите будить других, но при этом хотите слышать диалоги).

К сожалению, музыка этой формулы понижающего микширования намного ниже, чем в источнике 5.1 (что, вероятно, было задумано с учетом намерения Колльера создать микс «ночной моды»), и из-за полной потери трека LFE общий выходной звук не звучит так же полно или близко к источнику, как формула Dave_750 с повышенной громкостью .

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

Чтобы смешать формулу Nightmode Dialogue в FFmpeg:

ffmpeg -i "sourcetrack.dts" -c dca -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "stereotrack.dts" 

Тарк ответ

Этот ответ просто помещает формулу понижающего микширования Nightmode Dialogue из ответа Шейна Харрельсона в команду для преобразования аудиопотока в контейнер MKV. Хотя команда, приведенная в этом ответе, будет нормально работать с таким аудиопотоком, его адаптация к отдельной звуковой дорожке может привести к ошибке:

Фильтрация и потоковое копирование не могут использоваться вместе

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

Эта команда также включала избыточный -ac 2переключатель, который FFmpeg проигнорировал бы.


Тестовые команды

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

Тестовая команда, используемая для -ac 2опции:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -ac 2 "Audio 1 (-ac 2).wav"

Тестовая команда, использованная для ответа Грегори:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL < 1.0*FL + 0.707*FC + 0.707*BL|FR < 1.0*FR + 0.707*FC + 0.707*BR" "Audio 2 (ATSC Algorithm Downmix).wav"

Тестовая команда, использованная для ответа Dave_750:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -vol 425 -af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE" "Audio 4 (Dave750 Downmix).wav"

Тестовая команда, использованная для ответа Шейна Харрельсона:

ffmpeg -i "signed16bitPCM.wav" -c pcm_s16le -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" "Audio 3 (Nightmode Dialogue Downmix).wav"
Хашим
источник
1
Впечатляющее понимание! Спасибо, что нашли время, чтобы поделиться этим. Странно тогда, это -ac 2дало мне худший результат для начала, что вызвало первоначальную публикацию. Я попробую это снова и, если возможно, поделюсь отрывком 5.1, который не дает удовлетворительного результата со встроенным микшированием. Также очень приятно знать, что вы можете микшировать без перекодирования!
forthrin
@forthrin Имейте в виду, что кодирование и транскодирование - это две разные вещи. Транскодирование преобразуется из одного кодека / расширения в другой, а кодирование преобразуется в тот же кодек / расширение. Вы можете микшировать и применять другие эффекты FFmpeg к потоку без транскодирования, но не без кодирования. ac -2Вариант дал мне самую худшую результат всех понижающего микширования формул тоже, я думаю , что это просто провал формулы стандартной ATSC в.
Хашим
Я попробовал это сейчас. Кажется, что ffmpeg -i 5.1.mp4 -ac 2 2.mp4работает, но ffplay -i 5.1.mp4 -ac 2не работает.
четверть
9

Попробуйте это микширование:

-ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" 

как предложил Роберт Коллиер на форуме Doom9.

Шейн Харрельсон
источник
2
Что означают все эти варианты? Если вы объясните их, люди смогут использовать ваш ответ для решения различных проблем, а не просто копировать.
Дэвид Ричерби
2
@DavidRicherby -ac = Аудиоканалы (2 для стерео), -af =
Аудиофильтр
3
Попробовал это для фильма 5.1, и по крайней мере выходное стерео звучало для меня вполне нормально. Ясный диалог и больше ничего, казалось, не хватало. Было бы замечательно, если бы кто-то со знанием VLC мог точно рассказать о том, что там делается в стандартном микшировании с 5.1 по 2.0.
forthrin
2
@DavidRicherby: параметры внутри аудио фильтра (-af): FL = Front-left; BL = задний левый; FC = Front-центр; FR = Передняя правая; BR = Back-вправо. Поплавки являются линейными коэффициентами для уменьшения (<1) или увеличения (> 1) громкости умноженного канала. FL = FC + 0,30 * FL + 0,30 * BL устанавливает передний левый канал на передний центральный канал плюс 30% переднего левого и 30% заднего левого каналов.
kronenpj
1
FWIW: я считаю, что этот микс делает диалоги слишком громкими по сравнению с музыкой и окружающими звуками. Технически более правильное сочетание, приведенное в ответе Тарка, гораздо приятнее для меня. Поэтому я думаю, что вам, возможно, придется попробовать то, что лучше для вас, это зависит от ситуации.
июля
3

Итак, объединив @Shane Harrelson's с ответом @Jordan Harris на другой вопрос - с включенным ленивым режимом - вот что нужно для преобразования input_51.mkv(5.1) в output_stereo.mkv(стерео):

ffmpeg -i input_51.mkv -c:v copy \
    -ac 2 -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" \
    output_stereo.mkv

В -c:v copyчасти означает , что видеопоток не тронули (я предполагаю , что v IDEO с odec настройки в настоящее время полицейский СВУ). Без этого это займет гораздо больше времени. Просто повторение приведенного выше ответа для полноты -ac 2означает два аудиоканала и -afуказывает аудио-фильтр.

Посмотрев немного на команду, я понял, что она устанавливает, как составляются два стереоканала; FL(передний левый канал) берется из оригинала FC(передний центр) плюс 0.30*FL(30% от переднего левого) плюс 0.30*BL(30% от задней левой) и так далее.

ТАКП
источник
Будет ли это держать центральный канал согласованным и слышимым?
Фридо
2

Это старый вопрос, но он указал мне верное направление и хотел поделиться своим результатом:

-af "pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE"

Помещение половины FC и LFE в левый и правый дает в общей сложности 1 для их эффективной громкости от обоих громкоговорителей. Использование .707 * Front / Back Left / Right понижает эти каналы до хорошего уровня, чтобы они не подавляли центр.

Dave_750
источник
1

Если опция -ac 2 дает вам сбалансированное микширование, при котором ни музыка, ни речь не звучат слишком сильно, чем другие компоненты, вам просто нужно увеличить громкость с помощью

-vol 512

Я использовал 512 в примере, который увеличивает звук, делая его в два раза громче. Правило гласит, что 256 соответствует 100%

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

Мефисто
источник
1

-AC 2

Объем каналов в понижающем микшировании неизменен с помощью кодека с плавающей запятой -> pcm_f32le, aac

Объем в понижающем микшировании (от 5,1 до 2,0 без LFE) уменьшается на 1 / 2,5 = -7,96 дБ с целочисленным кодеком -> pcm_s16le, libfdk_aac

В фильмах звук направлен в одном направлении, и нет максимального звукового давления на всех каналах. Таким образом, уменьшенная громкость понижающего микширования является неправильной, малоуровневое сжатие является правильным способом. Это то, что делает Долби.

user1076138
источник
0

Прочитав всю эту страницу и проведя некоторые эксперименты, я разработал сценарий под названием «down_mix»:

#!/bin/bash -x

FL="0.5*FC + 0.707*FL + 0.707*BL + 0.5*LFE"
FR="0.5*FC + 0.707*FR + 0.707*BR + 0.5*LFE"
AUDIO_FMT="libopus"
CONTAINER="mkv"

ffmpeg -i "$1" -c:v copy -c:s copy \
    -c:a $AUDIO_FMT \
    -af "pan=stereo|FL=$FL|FR=$FR" \
    "${1%.*}"_dm.$CONTAINER

    # how to test a snippet of movie
    # -ss 41:07.0 -t 4 \

Настройте переменные выше по своему вкусу. У меня не было проблем с низким уровнем громкости, поэтому я оставил это, но легко добавил.

Гринго Суаве
источник
0

Фильтр ffmpeg "-ac 2" работает нормально, если ваша цель закодирована в pcm_s16le. При кодировании в pcm_f32le в формате wav громкость увеличивается на 9 дБ и более. Следовательно: не используйте фильтр «-ac 2» в таких случаях.

Франк-Майкл Фишер
источник
Почему громкость увеличивается? Где вы узнали об этом?
forthrin
Понятия не имею, почему. Но я очень частый пользователь ffmpeg (собираю его сам). Просто возьмите любой источник 5.1 (боковой) и преобразуйте его в pcm_s16le и также в wav-файл pcm_f32le, используя «-ac 2» оба раза. Сравните пиковые объемы двух файлов WAV, и вы увидите (и услышите):
Франк-Майкл Фишер,
это происходит, например, с помощью ffmpeg версии N-93636-g6829c3c
Франк-Майкл Фишер