繁体   English   中英

低延迟DASH Nginx RTMP

[英]Low Latency DASH Nginx RTMP

我在媒体服务器上使用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秒以下的延迟吗?

UPDATE

尝试使用此指令更改播放列表长度和片段长度

dash_playlist_length 10s;
dash_fragment 2s;

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

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

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

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

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

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

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

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

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

我的结果,

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

有关如何减少 github 延迟的问题,请参阅narlex的评论

您可能需要在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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM