Правильно натисніть 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, з таким же сильним гучністю в кінцевому результаті?


Ви впевнені, що VLC насправді відтворює додаткові канали? Змішування вниз може призвести до нормалізації, так що сума кожного входу на вихідний канал не призведе до перевантаження, тому запобігання відсікання. Це може зробити звук тихішим.
логіан

Основи: Мій файл 5.1. Мої колонки - стерео. Я не знаю, що робить VLC, але це створює чудовий результат у моїх стереодинаміків із вихідних даних 5.1 (сильна гучність, включена музика та діалог). ffmpeg, з іншого боку, створює результат "низької гучності" при використанні -ac 2. Тому я запитую, як зробити так, щоб ffmpeg генерував такий же хороший результат, як і VLC.
квітня

Відповіді:


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 повинні бути .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-канального джерела сигналів - задній лівий, задній правий, передній лівий, передній правий і передній центр - в канали Передній лівий і передній правий в вихідний стерео потік:

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

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

На жаль, у моїх тестах -ac 2 призвели до загального рівня як музики, так і діалогу, які найбільше відрізнялися від джерела, завдяки чому формула downmix дає найгірший результат з усіх тестованих формул, хоча ви можете перевірити його і виявити, що це дає вам абсолютно адекватний нижній мікс для ваших потреб, і в цьому випадку використання будь-якої іншої формули буде для вас непосильним.


Щоб змішувати доріжку 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 канали до стереосистеми за допомогою спеціального алгоритму поєднання

Якщо ви хочете отримати більш якісний downmix, або ви абсолютно повинні включити потік LFE у свій вихід, ви можете використовувати перемикач звукового фільтра FFmpeg (-af ) для зменшення звуку за допомогою спеціальної формули суміші.

Даймінг за формулою ATSC (відповідь Григорія)

На момент опублікування цієї відповіді, голосовою відповіддю на це запитання була Грегорі , яка формулює формулу зі специфікації ATSC (див. Розділ 7.8.2, Downmixing у два канали ) в аудіо фільтр FFmpeg. Ця специфікація безпосередньо пов'язана з документацією FFmpeg по цій темі , вказуючи на те, що велика ймовірність, що це така ж формула, яку FFmpeg вже реалізує для своєї -ac 2комутації. Якщо це правда, то введення всієї формули у відповіді Грегорі не відрізнятиметься від використання-ac 2 перемикача, а отже, марна трата часу.

Я вирішив перевірити це напевно, перекодувавши один і той же вхідний аудіо за допомогою обох -ac 2і-af фільтр з відповіді Грегорі (точні використовувані команди можна побачити у виносках до цієї відповіді).

Потім я порівняв розміри отриманих вихідних файлів і виявив, що вони, байт-байт, однакового розміру:

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

Нарешті, я відкрив обидва вихідні файли в Audacity і порівняв їхні форми сигналів, щоб підтвердити, що вони однакові (натисніть для збільшення):

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

Тому здається доволі переконливим, що формула ATSC, детально описана у відповіді Грегорі, та сама, яка вже була реалізована FFmpeg , і що використання її є абсолютно зайвим, коли вона нічого -ac 2не робить, і є набагато більш громіздкою командою.

Даймінг без відкидання каналу LFE (відповідь Dave_750)

З декількох, включених у відповіді, це єдина з формул downmix, яка, як видається, змішує канал LFE у вихідний стерео, а не відкидає його повністю, і як результат, та, яка забезпечує найменший звук від джерела, загублений.

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

Якщо у вас є можливість, я б настійно рекомендував кодувати свої аудіо потоки, використовуючи формулу downmix та downmix 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"

Даймінг з діалогом Нічного режиму Роберта Коллієра (відповідь Шейна Харрелсона)

Діалог формула нічного режиму , створений Роберт Collier на doom9 форумі і джерела Шейна Харрельсон в своїй відповіді, призводить до набагато краще , ніж понижувальної-ac 2 перемикач - замість того , щоб занадто тихі діалоги, він повертає їх до рівнів, які набагато ближче до джерело.

Із опису суміші Роберта Колєра:

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

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

На жаль, музика цієї формули downmix набагато нижча, ніж у джерелі 5.1 (що, ймовірно, за дизайном, враховуючи намір Колєра створити мікс "nightmode") і через повну втрату треку LFE, загальний вихідний аудіо не відповідає звук як повний або близький до джерела, як формула Dave_750 з підвищеною гучністю .

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

Щоб перемогти з допомогою формули діалога Nightmode у 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 downmix з відповіді Шейна Харрелсона в команду для перетворення звукового потоку в контейнер MKV. Хоча команда, дана у цій відповіді, буде добре працювати на такому аудіопотоці, адаптування її до окремої аудіодоріжки призведе до помилки:

Фільтр та потокове копіювання не можна використовувати разом

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

Ця команда також включала надмірний -ac 2перемикач, який FFmpeg ігнорував би.


Тестові команди

Щоб продемонструвати надійність тестів, які я проводив для цієї відповіді, нижче наведені всі команди, які я використовував для тестування кожної формули downmix.

Команда тесту, що використовується для -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 Майте на увазі, що кодування та перекодування - це дві різні речі. Перекодування перетворює з одного кодека / розширення в інше, а кодування перетворює в той же кодек / розширення. Ви можете змішувати та застосовувати інші ефекти FFmpeg до потоку без перекодування, але не без кодування. Ця ac -2опція дала мені найгірший результат із усіх формул downmix, я думаю, що це лише невдача формули стандарту ATSC.
Хашим

Я спробував це зараз. Здається, це ffmpeg -i 5.1.mp4 -ac 2 2.mp4працює, але ffplay -i 5.1.mp4 -ac 2ні.
передвістя

9

Спробуйте цей downmix:

-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 = Аудіо фільтр
Cestarian

3
Спробував це для фільму 5.1, і принаймні вихідний стерео звучав для мене цілком чудово. Чіткого діалогу та нічого іншого, здавалося, не бракує. Було б чудово, якби хтось із знаннями VLC міг би поділитися саме тим, що робиться там за замовчуванням 5.1 - 2.0 downmix.
квітня

2
@DavidRicherby: Параметри всередині звукового фільтра (-af): FL = Фронт-ліворуч; BL = назад-ліворуч; FC = Фронт-центр; FR = Передній правий; BR = Назад-праворуч. Поплавці є лінійними коефіцієнтами для зменшення (<1) або збільшення (> 1) обсягу розмноженого каналу. FL = FC + 0.30 * FL + 0.30 * BL встановлює передньо-лівий канал на передній-центральний канал плюс 30% передньо-лівого та 30% задньо-лівого каналів.
kronenpj

1
FWIW: Я вважаю, що ця суміш робить занадто гучними діалоги в порівнянні з музикою та атмосферою. Технічно правильніша суміш, надана у відповіді Тарка, мені набагато більше подобається. Тож, мабуть, вам доведеться спробувати те, що для вас найкраще, це залежить від ситуації.
jlh

3

Отже, поєднуючи відповідь @Shane Harrelson з @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 * Передній / Задній Вліво / Вправо приводить ці канали до хорошого рівня, щоб вони не перевантажували центр.


1

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

-vol 512

У прикладі я використав 512, який збільшує звук, роблячи його в два рази гучнішим. Правило полягає в тому, що 256 еквівалентно 100%

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


1

-ac 2

Обсяг каналів в downmix не змінюється при кодеці з плаваючою комою -> pcm_f32le, aac

Об'єм в downmix (5,1 до 2,0 без LFE) зменшується на 1 / 2,5 = -7,96 дБ з цілим кодеком -> pcm_s16le, libfdk_aac

Фільми мають звук, спрямований в одну сторону, і не існує максимального звукового тиску на всіх каналах. Тож зменшений об'єм downmix невірний, невеликий рівень стиснення - це правильний шлях. Ось що робить Долбі.


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 об'єм збільшується на 9dB і більше. Отже: Не використовуйте фільтр "-ac 2" у таких випадках.


Чому збільшується гучність? Де ви дізналися про це?
4

Не маю ідеї, чому. Але я дуже часто користувач ffmpeg (складаю сам). Просто візьміть будь-яке джерело 5.1 (збоку) і перетворіть його у pcm_s16le, а також у wav-файл pcm_f32le, використовуючи обидва рази "-ac 2". Порівняйте пікові обсяги двох файлів wav, і ви побачите (і почуєте):
Frank-Michael Fischer

це відбувається, наприклад, за допомогою ffmpeg версії N-93636-g6829c3c
Франк-Майкл Фішер,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.