Я транскодирую поток 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)?
Спасибо!