TrueHD.Клипинг при микшировании и автоматической регулировки громкости

Автор V0lt, 31 мая 2017, 05:45:49

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

V0lt

Многоканальные AC3 дорожки специально делают тихими, чтобы при микшировании в стерео не было клипинга.

Многоканальные TrueHD дорожки идут изначально громкими. Это приводит к тому, что при простом матричном микшировании в стерео получается заметный клипинг. Лечится нормализацией матрицы микширования, но у этого метода есть недостатки.

Так же есть сообщения, что автоматическая регулировка громкости (АРГ) также может создавать клипинг на громких треках. У меня есть некоторые сомнения по этому поводу. Этот момент необходимо будет перепроверить на громком стерео.
[merge_posts_bbcode]Добавлено: 2017-05-30 13:40:09[/merge_posts_bbcode]

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

Как вариант разрулить через АудиоПереключатель.
Например, если в АудиоПереключателе включена АРГ, то говорить аудио рендереру, чтобы тот использовал нормализованную матрицу микширования.

Еще есть идея с микшированием TrueHD в стерео в самом декодере. Речь идет о параметрах микширования зашитыми в TrueHD-поток. Способ так же работает для DD, DD+ и DTS.
[merge_posts_bbcode]Добавлено: 2017-05-30 22:36:06[/merge_posts_bbcode]

Реализация микширования в декодере:
Если в настройках плеера выбрать "Микшировать каналы в Стерео", то он через спец. метод говорит декодеру, чтобы тот по возможности декодировал в стерео. Если декодер поддерживает такое режим, то на выходе будет стерео. Если нет, то декодер выдает как есть,  и микшированием будет заниматься аудиопереключатель.

[merge_posts_bbcode]Добавлено: 2017-05-30 23:01:56[/merge_posts_bbcode]

1-й тестовый билд
Билд хорошо работает, если задать "Микшировать каналы в Стерео" до открытия файла.
На лету может тупить и не переключать, если в графе несколько декодеров (например, если открыть MKV с кучей дорожек).
[merge_posts_bbcode]Добавлено: 2017-05-31 05:45:49[/merge_posts_bbcode]

2-й тестовый билд
Исправлена работа с несколькими декодерами в графе.
PS: после переключения на лету возможно потребуется поиск по полосе прокрутки.

3-й тестовый билд
Исправлено переключение микшера декодера на лету.

4-й тестовый билд
Добавлен галка "Запросить стерео у декодера" ("Request stereo from the decoder").
PS: Возможен конфликт, если в системе установлен MpaDecFilter.ax.

Опция "Запросить стерео у декодера" введена в r2616.

Aleksoid1978

А может ну его нафиг "умный" микс в стерео ?? Ну добавить галку в декодер, типа "Downmix to stereo(AC3/DTS/TrueHD)". А то все эти лишние навороты ...
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Галка в плеере, галка в декодере - неудобно. А так управление микшированием будет в одном месте.
В коде ничего такого сложного нет. Осталось лишь заставить декодер на лету переключаться.

Aleksoid1978

Смотри как обрабатывается в аудио-переключателе изменение настроек, переменная m_bOutputFormatChanged.

Делаешь похожее в декодере и все.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

В общем сделал переключение на лету.
В начале думал сделать в методе класса CMpaDecFilter, но т.к. хватет вызова Init(codec, NULL), то сделал внутри CFFAudioDecoder.

Ссылка в первом сообщении.

Aleksoid1978

А вот что интересно - всегда ли, в том же TrueHD, присутствует этот самый стерео поток(обычно в самой первой substream - судя по коду ffmpeg декодера). И что будет если нет нужной информации - ffmpeg декодер выдаст так же стерео на выходе или оставит как есть. Да и вообще - такая информация в потоке она 100% обязательна или на усмотрения энкодера.
[merge_posts_bbcode]Добавлено: 2017-06-01 23:07:19[/merge_posts_bbcode]

Судя по коду ffmpeg TrueHD декодера - не факт что прям на 100% всегда будет присутствовать стерео данные. Вот что написано в комментах:
Set the layout for each substream. When there\'s more than one, the first substream is Stereo.

[merge_posts_bbcode]Добавлено: 2017-06-01 23:10:31[/merge_posts_bbcode]

Выложи сам патч - гляну по коду. Ну ты же знаешь - я такой дотошный, может какиенить моменты найду или косяки.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Хмм.
Твой ролик с прыгающими шариками в качетсве теста никуда не годиться. Там клипинг в самом файле после декодирования в FFmpeg получается.

Причем клипинг есть даже когда амплитуда за пределы не вышла (см. первую картинку).
Надо чего-нибудь покачественнее.
[merge_posts_bbcode]Добавлено: 2017-06-01 21:49:35[/merge_posts_bbcode]

6zc.thd нормальный. С ним наши микшеры (в переключателе и рендерере) трещат, а стерео из декодера без треска. Т.е. способ работает.

На AC3 тише становиться. Но скорее всего будет громче, чем если мы задействуем нормализацию. Т.к. по стандарту LFE канал не подмешивают, и ,соотвественно, доля остальных будет выше.

В общем надо подумать, обсудить. Есть кое-какие идеи.
Патч выложил там же, где сборки лежат.

Aleksoid1978

А может действительно в настройке аудио воткнуть галку(которая будет видна только если выбрали микширование в стерео) "Пытаться микшировать в декодере" ?? Так и сравнивать будет удобнее.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Добавил галку "Запросить стерео у декодера" ("Request stereo from the decoder").

PS: Возможен конфликт, если в системе установлен MpaDecFilter.ax.

Angel

а можно добавить функцию детекта MpaDecFilter.ax и вывода соотв. сообщения об этом?
или это сильно замедлит открытие файлов?

V0lt

Angel
Я обошел конфликт с MpaDecFilter.ax и ввел опцию "Запросить стерео у декодера" в r2616.
[merge_posts_bbcode]Добавлено: 2017-06-06 16:23:52[/merge_posts_bbcode]

Aleksoid1978
Код используемого нами "автоматической регулировки громкости" по-быстрому не понять.
Поэтому Я решил посмотреть, чего есть для регулировки громкости в FFmpeg:
alimiter - Audio lookahead limiter
acompressor - Audio compressor
compand - Compress or expand audio dynamic range
dynaudnorm - Dynamic Audio Normalizer
loudnorm - EBU R128 loudness normalization

С теми, что выделены можно экспериментировать. Нужны небольшие сэмплы с одновременно тихими и громкими участками.

Pa3yMucT

При включении "Автоматическая регулировка громкости" и "Повышать громкость" независимо от аудио формата  и рендерера происходит клиппинг на уровнях от 20 и выше (не говоря про дефолтные 75), при 15 клиппинг отсутствует, но громкость при этом заметно ниже чем в MPC-HC с его дефолтной нормализацией и усилением 400% и отсутствующим при этом клиппинге, хотя в отличиях от MPC-HC вы указываете "Улучшенная автоматическая регулировка громкости (взамен аудионормализиции)". Вот показательный пример https://disk.yandex.ru/i/5XV1wv-xxoDHyw

Aleksoid1978

Ну в MPC-HC совершенно другой алгоритм нормализации.
По поводу нашего алгоритма - а есть возможность "сдампить" PCM данные выхода с аудиокарты, есть вроде бы какие то виртуальные кабеля или что-то такое. Так можно было бы сравнить с оригиналом в аудио-редакторе.

Вот просто у меня все отлично на дефолтных 75%.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

Pa3yMucT

Сдампить я не знаю как, да и навряд ли проблема в моем железе, поскольку эта проблема проявляется на двух разных материнках с разными встройками от реалтек. Вы мой пример по ссылке пробовали и у вас нет щелчков на 5, 12, 13, 18, 19 секундах?

Aleksoid1978

Вот была уже похожая тема - https://mpc-be.org/forum/index.php?topic=507.0
В самом последнем сообщении можно сказать "подведен итог".
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215