https://yadi.sk/i/RHt7O-9UpDzy3
Воспроизведение идет рывками из-за того что в аудио декодере идет превышение лимита JITTER. LAV Audio - нормально.
Jitter в аудиодекодере - это довольно сложный момент. Он зависит от поступаемых данных и от задержек, которые может вносить FFmpeg декодер. Если с декодером можно разобраться (не быстро, но можно), то с преступаемыми данными может быть засада.
Если выкрою время, то планирую плотно заняться звуком.
Да ни от чего этого 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
Цитата: Aleksoid1978Немного подробнее про этот проблемный файл. Он реально кривой(но это не отменяет тот факт что его нормально играет LAV и должны играть мы).
Я не считаю, что мы должны играть такой файл.
Чисто ради интереса, ты уже анализировал код LAV Audio?
Да я смотрел как LAV работает. Он не берет конкретную разницу - а анализирует и получает минимальную разницу последних 50 пакетов. Т.е. когда такое абнормальное поведение - LAV его просто игнорирует. А если каждый пакет будет идти в разрыв - то тогда будет срабатывать проверка на максимальный jitter.
Норм. Тогда нужно как минимум два пакета принять не отдавая дальше.
Надо подумать...
Нет - все не так, ты не понял. Идут пакета, разница между расчетным и получаемым временем сохраняется(не более чем для 50 пакетов, когда доходит до 50 - данные начинают сохранятся с начала и т.д.) И LAV Audio проверяет не разницу в текущем пакете - а минимальную разницу из всех накопленных данных. Ты бы код глянул и все понял :)