Прямая трансляция H264 / MP4 из ffmpeg задерживается - PullRequest
0 голосов
/ 01 октября 2018

Я транскодирую поток MJPEG в H264 / MP4, используя ffmpeg.В качестве клиента я использую VLC.

Я использую эту командную строку:

ffmpeg \
  -use_wallclock_as_timestamps 1 \
  -f mjpeg \
  -i "http://127.0.0.1:4100/getMjpegStream=L" \
  -f mp4 \
  -vcodec libx264 \
  -movflags frag_keyframe+empty_moov+faststart \
  -tune zerolatency \
  -crf 30 \
  -preset ultrafast \
  -g 1 \
  -reset_timestamps 1 \
  -vsync 1 \
  -flags global_header \
  -r 15 \
  -listen 1 \
  -fflags flush_packets \
  -avioflags direct \
  -flush_packets 1 \
  *output_URL*

Если я установлю output_URL на это:

udp://127.0.0.1:5000?pkt_size=1316

работает просто отлично.Я запускаю ffmpeg, затем через некоторое время запускаю VLC с этим URL udp://@127.0.0.1:5000, и он воспроизводит (почти) в реальном времени.Задержка составляет 1-2 секунды, что приемлемо.И эта задержка постоянна, она не зависит от того, когда я запускаю VLC.Я могу остановить и снова открыть VLC, и он продолжает работать в режиме реального времени.

Но мне нужно, чтобы этот поток также просматривался в браузере (в видео HTML5), поэтому я обычно использую его для output_URL :

http://127.0.0.1:5000

В VLC я использую этот URL http://127.0.0.1:5000, и он также работает нормально, но только если я запускаю VLC сразу после запуска ffmpeg.Если между началом ffmpeg и началом VLC существует значительная задержка, то эта задержка будет заметна при воспроизведении.Допустим, я запускаю ffmpeg в момент времени T, а затем через 10 секунд (при T + 10) запускаю VLC.У меня есть такое поведение в VLC:

  • Запускается и отображает кадр в момент времени T, а затем поток останавливается
  • Через 10 секунд потоковая передача возобновляется в VLC и начинаетсявоспроизводится, но изображение на 10 секунд отстает от «реального времени»
  • Эта задержка постоянна, она не восстанавливается

Есть ли способ решить эту проблему?

  • Указывать ffmpeg начинать транскодирование только при подключении клиента?
  • Указывать ffmpeg не буферизовать транскодированный поток до тех пор, пока клиент не подключится?(в текущей командной строке он явно буферизуется, потому что, когда VLC начинается с T + 10, первый отображаемый кадр относится ко времени T)?

Спасибо!

...