ffmpeg的H264 / MP4实时流被延迟

时间:2018-09-30 21:46:50

标签: ffmpeg video-streaming mp4 live-streaming video-encoding

我正在使用ffmpeg将MJPEG流转码为H264 / MP4。作为客户端,我正在使用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,然后过一段时间,我使用此URL udp://@127.0.0.1:5000启动VLC,它(几乎)实时播放。延迟为1-2秒,可以接受。而且此延迟是恒定的,它与我启动VLC的时间无关。我可以停止并重新打开VLC,它会实时运行。

但是我还需要在浏览器中观看此流(在HTML5视频中),因此通常将其用于 output_URL

http://127.0.0.1:5000

在VLC中,我使用此URL http://127.0.0.1:5000,它也可以正常工作,但前提是我必须在启动ffmpeg之后立即启动VLC。如果在ffmpeg的开始与VLC的开始之间存在明显的延迟,则该延迟将在播放中引起注意。假设我在时间T启动ffmpeg,然后在10秒后(在T + 10)启动VLC。我在VLC中有此行为:

  • 它开始,并在时间T显示帧,然后流冻结
  • 10秒后,视频流将在VLC中恢复并开始播放,但是图像比“实时”晚10秒
  • 此延迟是恒定的,无法从中恢复

有没有办法解决这个问题?

  • 指示ffmpeg仅在客户端连接时才开始转码吗?
  • 指示ffmpeg在客户端连接之前不缓冲转码后的流? (在当前命令行中,它明显缓冲,因为当VLC在T + 10开始时,显示的第一帧是从时间T开始的)?

谢谢!

0 个答案:

没有答案