Опять проблема со встроенным Audio Decoder(превышение JITTER)

Автор Aleksoid1978, 21 февраля 2016, 12:06:19

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

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

Aleksoid1978

https://yadi.sk/i/RHt7O-9UpDzy3

Воспроизведение идет рывками из-за того что в аудио декодере идет превышение лимита JITTER. LAV Audio - нормально.
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

Jitter в аудиодекодере - это довольно сложный момент. Он зависит от поступаемых данных и от задержек, которые может вносить FFmpeg декодер. Если с декодером можно разобраться (не быстро, но можно), то с преступаемыми данными может быть засада.

Если выкрою время, то планирую плотно заняться звуком.

Aleksoid1978

Да ни от чего этого Jitter не зависит. Что у нас - сравниваем расчетные временные метки с теми что идут от сплиттера. Если превышает установленный лимит - то делается сброс данных, обнуление расчетных временных меток и т.д.

Вот из-за этого данный файл и играет рывками.
[merge_posts_bbcode]Добавлено: 2016-02-21 22:29:04[/merge_posts_bbcode]

Немного подробнее про этот проблемный файл. Он реально кривой(но это не отменяет тот факт что его нормально играет LAV и должны играть мы).

Дело в том что периодически приходят пакеты с временными метками "старыми", т.е. со значением меньше чем были до этого. Вот пример из Debug log:

mpc-be.exe(tid 2d30)    39853 : CMpaDecFilter::Receive(): [  75729999 =>   75943332], 213333
mpc-be.exe(tid 2d30)    41062 : CMpaDecFilter::Receive(): [  75943332 =>   76156665], 213333
mpc-be.exe(tid 2d30)    41772 : CMpaDecFilter::Receive(): [  76156665 =>   76369998], 213333
mpc-be.exe(tid 2d30)    42380 : CMpaDecFilter::Receive(): [  76369998 =>   76583331], 213333
mpc-be.exe(tid 2d30)    43140 : CMpaDecFilter::Receive(): [  76583331 =>   76796664], 213333
mpc-be.exe(tid 2d30)    46012 : CMpaDecFilter::Receive(): [  76800000 =>   77013333], 213333
mpc-be.exe(tid 2d30)    46923 : CMpaDecFilter::Receive(): [  77013333 =>   77226666], 213333
mpc-be.exe(tid 2d30)    47532 : CMpaDecFilter::Receive(): [  77226666 =>   77439999], 213333
mpc-be.exe(tid 2d30)    48091 : CMpaDecFilter::Receive(): [  77439999 =>   77653332], 213333
mpc-be.exe(tid 2d30)    49233 : CMpaDecFilter::Receive(): [  77653332 =>   77866665], 213333
mpc-be.exe(tid 2d30)    49939 : CMpaDecFilter::Receive(): [  77866665 =>   78079998], 213333
mpc-be.exe(tid 2d30)    50700 : CMpaDecFilter::Receive(): [  78079998 =>   78293331], 213333
mpc-be.exe(tid 2d30)    51308 : CMpaDecFilter::Receive(): [  78293331 =>   78506664], 213333
mpc-be.exe(tid 2d30)    52170 : CMpaDecFilter::Receive(): [  78510000 =>   78723333], 213333
mpc-be.exe(tid 2d30)    52932 : CMpaDecFilter::Receive(): [  78723333 =>   78936666], 213333
mpc-be.exe(tid 2d30)    53540 : CMpaDecFilter::Receive(): [  78936666 =>   79149999], 213333
mpc-be.exe(tid 2d30)    57316 : CMpaDecFilter::Receive(): [  79149999 =>   79363332], 213333
mpc-be.exe(tid 2d30)    58410 : CMpaDecFilter::Receive(): [  79363332 =>   79576665], 213333
mpc-be.exe(tid 2d30)    59069 : CMpaDecFilter::Receive(): [  79576665 =>   79789998], 213333
mpc-be.exe(tid 2d30)    59527 : CMpaDecFilter::Receive(): [  79789998 =>   80003331], 213333
mpc-be.exe(tid 2d30)    60842 : CMpaDecFilter::Receive(): [  80003331 =>   80216664], 213333
mpc-be.exe(tid 2d30)    61501 : CMpaDecFilter::Receive(): [  78510000 =>   78723333], 213333
mpc-be.exe(tid 2d30)    61501 : CMpaDecFilter::Receive() : jitter limit is exceeded - 1700000

Как видно что пришел пакет со временем 78510000 что на много меньше не только предыдущего значения, но и многих предыдущих. Дальше пакеты пойдут с нормальным временем, по нарастанию. Потом опять может прийти пакет с сильным отличием от предыдущих - но может и с увеличением.
[13684] mpc-be.exe(tid 1e98)      652 : CMpaDecFilter::Receive(): [   3203332 =>    3416665], 213333
[13684] mpc-be.exe(tid 1e98)      653 : CMpaDecFilter::Receive(): [   3416665 =>    3629998], 213333
[13684] mpc-be.exe(tid 1e98)      654 : CMpaDecFilter::Receive(): [   3629998 =>    3843331], 213333
[13684] mpc-be.exe(tid 1e98)      655 : CMpaDecFilter::Receive(): [   3843331 =>    4056664], 213333
[13684] mpc-be.exe(tid 1e98)      656 : CMpaDecFilter::Receive(): [   4690000 =>    4903333], 213333
[13684] mpc-be.exe(tid 1e98)      656 : CMpaDecFilter::Receive() : jitter limit is exceeded - 1276667
[13684] mpc-be.exe(tid 1e98)      656 : CMpaDecFilter::Receive() : Resync Request - [3413333 -> 4690000], buffer : 0
[13684] mpc-be.exe(tid 1e98)      657 : CMpaDecFilter::Receive(): [   4903333 =>    5116666], 213333
[13684] mpc-be.exe(tid 1e98)      657 : CMpaDecFilter::Receive(): [   5116666 =>    5329999], 213333
[13684] mpc-be.exe(tid 1e98)      658 : CMpaDecFilter::Receive(): [   5329999 =>    5543332], 213333
[13684] mpc-be.exe(tid 1e98)      659 : CMpaDecFilter::Receive(): [   5543332 =>    5756665], 213333
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Немного подробнее про этот проблемный файл. Он реально кривой(но это не отменяет тот факт что его нормально играет LAV и должны играть мы).
Я не считаю, что мы должны играть такой файл.

Чисто ради интереса, ты уже анализировал код LAV Audio?

Aleksoid1978

Да я смотрел как LAV работает. Он не берет конкретную разницу - а анализирует и получает минимальную разницу последних 50 пакетов. Т.е. когда такое абнормальное поведение - LAV его просто игнорирует. А если каждый пакет будет идти в разрыв - то тогда будет срабатывать проверка на максимальный jitter.
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

Нет - все не так, ты не понял. Идут пакета, разница между расчетным и получаемым временем сохраняется(не более чем для 50 пакетов, когда доходит до 50 - данные начинают сохранятся с начала и т.д.) И LAV Audio проверяет не разницу в текущем пакете - а минимальную разницу из всех накопленных данных. Ты бы код глянул и все понял :)
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