低延迟DASH Nginx RTMP

时间:2017-05-09 11:47:10

标签: nginx ffmpeg rtmp mpeg-dash

我在媒体服务器上使用arut nginx-rtmp-module(https://github.com/arut/nginx-rtmp-module),然后我尝试使用FFmpeg流式传输到dash应用程序,然后我通过使用VLC播放来测试流。

它等待大约30秒开始播放,它从头开始播放,而不是当前的时间戳。

这是我在RTMP块上的当前配置

rtmp {
    server {
        listen 1935;

        application live {
            live on;

           exec ffmpeg -re -i rtmp://localhost:1935/live/$name
              -c:a libfdk_aac -b:a 32k  -c:v libx264 -b:v 128K -f flv rtmp://localhost:1935/hls/$name_low
              -c:a libfdk_aac -b:a 64k  -c:v libx264 -b:v 256k -f flv rtmp://localhost:1935/hls/$name_mid
              -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost:1935/hls/$name_hi
              -c:a libfdk_aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost:1935/dash/$name_dash;
        }

        application hls {
             live on;

             hls on;
             hls_path /tmp/hls;
             hls_nested on;

             hls_variant _low BANDWIDTH=160000;
             hls_variant _mid BANDWIDTH=320000;
             hls_variant _hi  BANDWIDTH=640000;
        }

        application dash {
            live on;

            dash on;
            dash_path /tmp/dash;
            dash_nested on;
        }
    }
}

这是我用于流式传输的命令

ffmpeg -re -i 2014\ SPRING.mp4 -c copy -f flv 
rtmp://52.221.221.163:1935/dash/spring

如何减少延迟,并使其与流媒体的时间戳相同?

我可以达到5秒以下的延迟吗?

更新

尝试使用此指令

更改播放列表长度和片段长度
dash_playlist_length 10s;
dash_fragment 2s;

但仍有一些延迟问题,有时它比以前小,有时它是相同的

3 个答案:

答案 0 :(得分:5)

  

我可以达到5秒以下的延迟吗?

没有。 DASH是一种分段协议,意味着您的媒体被切割成相对较大的块。玩家必须先下载一些块才能开始播放它们。您的编码器必须在这些块甚至出现在清单中之前上传整个块。这是工作的错误工具,任何通过降低块大小来减少延迟的尝试都会给项目增加大量开销。如果延迟对您很重要,那么您正在使用错误的工具

  

如何减少延迟,并使其与流媒体的时间戳相同?

你做不到。物理!你不可能在编码的同时播放同样的东西。您通过分组交换网络发送数据,其中许多编码/解码步骤都需要缓冲区,因为它们以块的形式工作。回放同时播放内容的唯一方法就是模拟...至少在那里你唯一的延迟就是光速。

您可以做的最好的事情是切换到专为低延迟而设计的协议,例如WebRTC。只要确定你理解权衡。您的编解码器将针对延迟而非质量进行优化...因此您的质量将受到影响。 WebRTC over UDP(可选但常见)意味着某些数据包会丢失,导致您的观看体验受损。当你关心延迟时,如果你在这里或那里丢失了一块,那么重要的是你继续前进。您可以通过TCP使用WebRTC,并使您的可靠性仅略微增加延迟。

决定对你真正重要的事情。几乎在所有情况下,实际上并不是低延迟。你无法全力以赴。每种方法都有权衡。您必须决定什么是最适合您的具体情况。

答案 1 :(得分:4)

我对VLC媒体播放器也有同样的问题。大多数延迟是由客户端播放器,您可以使用没有缓冲区的ffplayer来检查它。

ffplay -fflags nobuffer rtmp://192.168.1.66/myapp/live

我的结果,

  • VLC的潜伏期:6~7s
  • ffplay的延迟:500ms

有关更多信息,请参阅github上的comment of narlex of issue how to reduce latency

答案 2 :(得分:2)

您可能需要在ffmpeg命令中更改GOP大小。 ffmpeg的默认GOP大小为250,这意味着每250帧会有一个关键帧。如果你的输出是25fps,那么在最坏的情况下你将每10秒有一个关键帧(如果启用了场景剪切检测,你的关键帧间隔可能会更短)。

对于HLS和DASH,段必须以关键帧开头。所以你会有很多段,持续时间为10秒。您需要减少段持续时间(GOP大小)以减少延迟。

尝试修改ffmpeg命令,如下所示,看看是否有帮助

exec ffmpeg -re -i rtmp://localhost:1935/live/$name
          -c:a libfdk_aac -b:a 32k  -c:v libx264 -g 50 -b:v 128K -f flv rtmp://localhost:1935/hls/$name_low
          -c:a libfdk_aac -b:a 64k  -c:v libx264 -g 50 -b:v 256k -f flv rtmp://localhost:1935/hls/$name_mid
          -c:a libfdk_aac -b:a 128k -c:v libx264 -g 50 -b:v 512K -f flv rtmp://localhost:1935/hls/$name_hi
          -c:a libfdk_aac -b:a 128k -c:v libx264 -g 50 -b:v 512K -f flv rtmp://localhost:1935/dash/$name_dash;