GStreamer в FFmpeg: MEDIA_ERR_DECODE

Вопрос или проблема

Я использую GStreamer для получения RTP MPEG-2 транспортного потока, его декодирования, перекодирования в H.264 и отправки по UDP в FFmpeg для вывода MPEG-DASH. Однако я сталкиваюсь с проблемой MEDIA_ERR_DECODE при попытке воспроизвести созданный DASH поток.

udpsrc address={multicast-address} port=6310 do-timestamp=true timeout=60000000000 buffer-size=1310172 caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)MP2P,payload=96" ! rtpbin name=recv_rtp ! rtpjitterbuffer latency=500 ! queue leaky=downstream max-size-time=5000000000 max-size-buffers=0 max-size-bytes=0 ! watchdog timeout=10000 ! rtpmp2pdepay ! mpegpsdemux name=demux demux.video_e0 ! mpegvideoparse ! queue leaky=downstream max-size-time=5000000000 max-size-buffers=0 max-size-bytes=0 ! decodebin ! videoconvert ! video/x-raw,format=RGBA ! deinterlace method=vfir fields=top ! videoconvert ! videorate drop-only=true ! video/x-raw,framerate=25/1 ! openh264enc bitrate=49152 gop-size=5 ! h264parse ! video/x-h264,stream-format=byte-stream,alignment=nal ! rndbuffersize max=65000 ! queue leaky=downstream max-size-time=5000000000 max-size-buffers=0 max-size-bytes=0 ! udpsink host=127.0.0.1 port=6311 sync=false max-lateness=0

Команда FFmpeg:

ffmpeg -loglevel debug -probesize 32 -analyzeduration 0 -i udp://127.0.0.1:6311?buffer-size=1310172 -fflags +nobuffer -flags low_delay -err_detect ignore_err -c:v copy -c:a copy -movflags +frag_keyframe+empty_moov+default_base_moof -pix_fmt yuv420p -preset ultrafast -tune zerolatency -window_size 30 -extra_window_size 15 -use_template 1 -use_timeline 0 -streaming 1 -adaptation_sets "id=0,streams=v id=1,streams=a" -utc_timing_url "http://time.akamai.com/?iso" -write_prft 1 -index_correction 1 -seg_duration 4 -frag_duration 0.2 -frag_type duration -flags +global_header -format_options "movflags=cmaf" -ldash 1 -target_latency 2.0 -http_persistent 1 -f dash manifest.mpd

Проблема:

При попытке воспроизвести DASH поток в браузере я получил Ошибка MEDIA_ERR_DECODE: Resetting the MediaSource

Заключение:

Согласно документации MDN Web и спецификации HTML, ошибка MEDIA_ERR_DECODE возникает, когда попытка декодирования ранее определенных как пригодные медиа-данных приводит к ошибке. Это обычно происходит из-за поврежденных кадров, отсутствия ключевых кадров, неправильных меток времени или несоответствия форматов в потоке.

Вопрос:

Какие изменения я могу внести в свою команду FFmpeg, чтобы избежать этих проблем с декодированием и обеспечить более стабильное воспроизведение?

Буду признателен за любую помощь или предложения. Заранее спасибо! 🙌

Ответ или решение

Для решения проблемы с ошибкой MEDIA_ERR_DECODE, возникающей при попытке воспроизведения созданного DASH потока, необходимо тщательно проанализировать вашу настройку GStreamer и команду FFmpeg. Проблема может крыться в нескольких аспектах, таких как недостающие ключевые кадры, неправильные временные метки или несоответствие форматов. Давайте разберем каждый из этих пунктов.

Теория: Понимание проблемы

Ошибка MEDIA_ERR_DECODE в основном указывает на возникновение проблем во время декодирования медиа данных, которые ранее считались пригодными для использования. Из документации MDN и спецификаций HTML следует, что ошибка часто возникает из-за поврежденных кадров, недостающих ключевых кадров, неправильных временных меток или несоответствий форматов.

Неправильные временные метки или поврежденные данные могут возникнуть на любом этапе обработки медиа, включая декодирование, перекодирование и передача данных. Ваша цепочка обработки заключается в получении RTP-потока через GStreamer, его декодировании и перекодировании в формат H.264, а затем передаче через UDP к FFmpeg для создания DASH потока. Каждое из этих звеньев может содержать элементы, которые влияют на целостность и воспроизводимость конечного потока.

Пример: Текущая настройка и ее недостатки

Рассмотрим ваши текущие команды для GStreamer и FFmpeg:

  1. GStreamer:

    Вы используете GStreamer для захвата и обработки RTP MPEG-2 транспортного потока. Обратите внимание на использование таких элементов, как rtpjitterbuffer, decodebin, и openh264enc. Важным аспектом здесь является наличие ключевых кадров в H.264, поскольку они необходимы для декодирования.

  2. FFmpeg:

    Команда FFmpeg нацелена на быстрый и низкозадержечный вывод, что видно из заданных флагов, таких как -tune zerolatency. Однако, недостаток ключевых кадров или другие проблемы с временными метками могут внести искажения.

Применение: Улучшение стабильности воспроизведения

  1. Ключевые кадры и GOP:

    Убедитесь, что ваш кодировщик H.264 (openh264enc) генерирует достаточное количество ключевых кадров (I-кадры). Это критически важно для воспроизведения в DASH. Попробуйте уменьшить размер группы кадров (GOP size) до меньшего значения, например gop-size=10.

  2. Временные метки и буферизация:

    Проверьте, что временные метки видео и аудио в потоке синхронизированы. Можно рассмотреть возможность изменения настроек rtpjitterbuffer для более точной коррекции времени и предупреждения потери пакетов.

  3. Отладка и диагностика:

    Для точной диагностики используйте отладочные функции как в GStreamer, так и в FFmpeg. В GStreamer можно попробовать создать дамп потоков для последующего анализа, а в FFmpeg активировать более подробное логирование для выявления проблем с декодированием.

  4. Совместимость с DASH:

    Проверьте настройки формата DASH в командной строке FFmpeg на предмет соответствия спецификациям. Возможно, потребуется настройка таких параметров, как временные метки или настройки адаптации потоков, чтобы обеспечить совместимость с используемым плеером.

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

Таким образом, детальное понимание работы каждого компонента и последовательное устранение возможных проблем помогут вам добиться стабильной и качественной работы с DASH потоками.

Оцените материал
Добавить комментарий

Капча загружается...