Есть мультикаст поток, внутри mpegts h264, задача перегнать его в hls без изменений.
/usr/bin/ffmpeg -i udp://239.0.110.16:1234 -map 0:0 -map 0:1 -vcodec copy -acodec copy -copyts -async 100 -ignore_unknown -loglevel warning -f hls -hls_list_size 5 -hls_time 5 -hls_flags delete_segments /var/www/html/ffmpeg/stream.m3u8
Работает замечательно, но во входящем потоке иногда прилетают ошибки в логе ffmpeg можно наблюдать такую запись:
[mpegts @ 0x56397b59a500] PES packet size mismatch
Что означает данная ошибка я знаю, как либо нормализовать входящий поток не представляется возможным.
После данной ошибки все нормальные потребители и плееры работают нормально. Кроме приставок на Android которые забирают hls c помощью Stagefright (версии начиная с Nougat). Изображение на приставке периодически рассыпается, пока не перезапустишь ffmpeg, как только ffmpeg "поймает" PES packet size mismatch картинка снова рассыпается. Причем проблема именно в ffmpeg т.к перезагрузка приставки ничего не дает. В остальных клиентах картинка просто идеальная без проблем и глюков.
Гугление привело к переписке пятилетней давности с разработчиками ffmpeg где человек описывает данную проблему и говорит что установка PES packet length = 0 ее решает. Аналогичная проблема известна на wowza и у них есть данная настройка:
mpegtsAlwaysSendZeroPacketLen – If you don't want video frames to be wrapped in multiple TS packets for very high bitrate streams, set to true to set packetized elementary stream (PES) packet length to 0 (zero)
Вопрос - как принудительно установить в заголовке PES packet length = 0 средствами ffmpeg? Курение километровой доки ничего не дало, а постоянные перезапуски ffmpeg - это костыль.