Вопрос или проблема
Я транскодирую RTMP входящий поток с сервера NGINX на UDP TS поток h264 и mp2 с помощью ffmpeg и программного кодировщика libx264. Время от времени процесс транскодирования зависает на инициализации и не запускается.
Команда:
ffmpeg -re -i rtmp://127.0.0.1/ingesting -c:a mp2 -c:v libx264 -ar 48000 -profile:v main -x264opts interlaced=1:nal-hrd=cbr -preset ultrafast -tune zerolatency -vf scale=720x576,setdar=16/9,format=yuv420p,fps=fps=25,setfield=mode=tff -flags +ilme+ildct -streamid 0:0x201 -streamid 1:0x202 -mpegts_pmt_start_pid 0x200 -mpegts_start_pid 0x203 -metadata:s:a:0 language="" -mpegts_service_id 2 -mpegts_transport_stream_id 9217 -metadata provider_name="PNAME" -metadata service_name="SNAME" -minrate 2M -maxrate 2M -bufsize 1500k -muxrate 2600k -f mpegts -pcr_period 30 -b:v 2M "udp://239.1.67.71:1234?pkt_size=1316&bitrate=2600000&dscp=34&localaddr=10.61.5.10"
FFMPEG собран из последнего git, с поддержкой CUDA GPU, но не используется в этом процессе транскодирования.
ffmpeg version N-100673-g553eb07737 Copyright (c) 2000-2021 the FFmpeg developers built with gcc 8 (Debian 8.3.0-6) configuration: --enable-nonfree --enable-cuda --enable-cuvid --enable-nvenc --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --enable-static --enable-pthreads --enable-gpl --enable-nonfree --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-filters --enable-openssl
С уровнем логирования debug я получаю следующую ошибку:
cur_dts is invalid st:0 (513) [init:0 i_done:0 finish:0] (это безвредно, если происходит один раз в начале на поток)
Полный лог здесь: https://pastebin.com/nC7GFcf4
ОБНОВЛЕНИЕ:
Эта проблема возникает только с последней версией git из ветки master (N-100673-g553eb07737). В версии 4.3 (n4.3.1-221-gd08bcbffff) этой проблемы не возникает.
В моем случае добавление --enable-parser=h264 --enable-parser=acc
к командной строке конфигурации решило проблему. Возможно, вам нужен другой парсер. Команда configure --list-parsers
перечисляет все доступные парсеры для включения.
Ответ или решение
Проблема с ошибкой "cur_dts is invalid" в процессе транскодирования с помощью FFMPEG может возникать по нескольким причинам, особенно при работе с потоковым видео и аудио, как в случае с RTMP. В данном случае вы работаете с проектом, собранным из последней версии исходного кода FFMPEG, в отличие от стабильного релиза (4.3), где эта проблема не наблюдалась.
Ошибка cur_dts is invalid
Согласно вашему описанию, ошибка "cur_dts is invalid" (текущий DTS является недействительным) возникает в момент инициализации потока, что может указывать на проблемы с синхронизацией или ошибками в начальных метаданных. Эта ошибка является обыденной и может не быть критической, если она возникает всего один раз в начале потока. Однако, если процесс транскодирования зависает, это может указывать на более глубокую проблему.
Возможные причины и решения
-
Использование парсеров:
Один из наиболее эффективных способов решения данной проблемы – это наличие правильных парсеров для используемых кодеков. Вы упомянули, что добавление опций--enable-parser=h264 --enable-parser=acc
в команду конфигурации решило вашу проблему. Это указывает на то, что FFMPEG может не обрабатывать входящий поток корректно без соответствующих парсеров. Проверьте наличие других парсеров, которые могут понадобиться для вашего конкретного сценария, запустив команду:configure --list-parsers
-
Параметры трансляции:
Проверьте параметры, указанные в вашей команде FFMPEG. Убедитесь, что значения переданных параметров соответствуют ожидаемым: например, проверка аудионастройки, частоты дискретизации и объемного битрейта, которые могут вызывать проблемы в зависимости от формата RTMP. -
Проблемы с потоками RTMP:
Иногда зависание также может быть связано с проблемами на стороне сервера RTMP (NGINX). Убедитесь, что сервер может обрабатывать входящие потоки без ошибок. Используйте утилиты для мониторинга RTMP-потока и проверьте, нет ли каких-либо проблем с сетевыми подключениями или внутренними ошибками. -
Различия в версиях FFMPEG:
Вы упомянули, что проблема наблюдается только в последней версии сборки. Возможно, в коде произошли изменения, которые повлияли на обработку RTMP-источников. Рекомендуется проверить официальные изменения в репозитории FFMPEG, чтобы выяснить, не произошли ли изменения, которые могли бы вызвать такую проблему. -
Логирование:
Убедитесь, что у вас включено детализированное логирование FFMPEG. Это поможет вам лучше отследить, на каком этапе происходит зависание и какие операции выполняются до появления ошибки. Используйте опцию-loglevel debug
для большей детализации логов.
Заключение
Учитывая вышеперечисленные рекомендации, если ошибка "cur_dts is invalid" все еще будет возникать, рассмотрите возможность отката к более стабильной версии FFMPEG (например, вы уже протестировали версию 4.3) или попытайтесь ввести более специфические параметры конфигурации, чтобы нормализовать процесс трансляции. Постоянный мониторинг и логирование помогут вам в дальнейшем поддержании работоспособности вашего медицинского транскодирования.