如何使用ffmpeg最小化实时流媒体的延迟

时间:2013-05-20 21:41:42

标签: ffmpeg streaming delay http-live-streaming webm

我有一个问题。 我想从我的网络摄像头用ffmpeg进行直播。

  1. 我启动了ffserver并且它可以正常工作。
  2. 我从另一个终端启动ffmpeg以使用此命令进行流式传输 它有效:

    sudo ffmpeg -re -f video4linux2 -i /dev/video0 -fflags nobuffer -an http://localhost:8090/feed1.ffm
    
  3. 在我的配置文件中,我有这个流:

    <Stream test.webm>
    Feed feed1.ffm
    Format webm
     NoAudio
     VideoCodec libvpx
     VideoSize 720x576
     VideoFrameRate 25
     # Video settings
        VideoCodec libvpx
        VideoSize 720x576           # Video resolution
        VideoFrameRate 25           # Video FPS
        AVOptionVideo flags +global_header  # Parameters passed to encoder 
                                        # (same as ffmpeg command-line parameters)
        AVOptionVideo cpu-used 0
        AVOptionVideo qmin 10
        AVOptionVideo qmax 42
        #AVOptionVideo quality good
        PreRoll 5
         StartSendOnKey
        VideoBitRate 400            # Video bitrate
     </Stream>
    
  4. 我用

    启动流

    ffplay http:// 192.168.1.2 :8090 / test.webm 它有效,但我有4秒的延迟,我会尽量减少这种延迟,因为这对我的应用程序至关重要。 感谢

3 个答案:

答案 0 :(得分:14)

FFMpeg的流媒体指南有一个关于如何减少延迟的特定部分。我还没有尝试过他们所有的建议。 http://ffmpeg.org/trac/ffmpeg/wiki/StreamingGuide#Latency

他们特别注意了ffplay引入的延迟:

  

默认情况下,ffplay会引入自己的小延迟,mplayer及其-nocache用于测试延迟(或-benchmark)也很有用。   使用SDL out也可以查看具有最小延迟的帧:ffmpeg ... -f sdl -

答案 1 :(得分:2)

您可以尝试此命令

ffplay -fflags nobuffer -rtsp_transport tcp rtsp://<host>:<port>

或更精心但实验性的:

ffplay -fflags nobuffer -flags low_delay -framedrop \
 -strict experimental -rtsp_transport tcp rtsp://<host>:<port>

或hacky:

ffplay  -probesize 32 -sync ext -rtsp_transport tcp rtsp://<host>:<port>

根据您的流式传输,-rtsp_transport可以设置为udptcp。对于此示例,我使用的是tcp

答案 2 :(得分:0)

尝试将flags中的AVFormatContext设置为AVFMT_FLAG_NOBUFFER | AVFMT_FLAG_FLUSH_PACKETS

AVFormatContext *ctx;
...
ctx->flags = AVFMT_FLAG_NOBUFFER | AVFMT_FLAG_FLUSH_PACKETS;

然后尝试将解码器线程设置为1。似乎更多的线程会导致更多的延迟。

AVCodecContext *ctx;
...
ctx->thread_count = 1;