Inlarion
@Inlarion

FFmpeg как установить PES packet length равным нулю?

Есть мультикаст поток, внутри 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 - это костыль.
  • Вопрос задан
  • 747 просмотров
Пригласить эксперта
Ответы на вопрос 1
IlyaEvseev
@IlyaEvseev
Opensource geek
В https://ffmpeg.org/pipermail/ffmpeg-devel/2014-Apr... в 2014 году предлагалось исправление.

Судя по https://github.com/FFmpeg/FFmpeg/blob/master/libav... - исправление принято, но в измённом виде, проверяется другой кодек + флаг omit_video_pes_length.

В https://ffmpeg.org/ffmpeg-formats.html написано, что по умолчанию флаг включен.

Поэтому имеет смысл проверить:
1) исходники используемой версии ffmpeg - есть ли в них этот кусок?
2) помогает ли явная установка флага?
3) ручную сборку ffmpeg самой свежей версии
4) ручную сборку с патчем из первой ссылки
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы