2017-05-09 493 views
1

我在媒体服务器上使用arut nginx-rtmp-module(https://github.com/arut/nginx-rtmp-module),然后我尝试使用FFmpeg流向dash应用程序,然后通过使用VLC播放它来测试流。低延迟DASH Nginx RTMP

它等待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; 

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

回答

3

我可以在5秒延迟下实现吗?

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

我该如何减少延迟,并使其与流光标相同的时间戳播放?

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

您可以做的最好的切换到为低延迟设计的协议,如WebRTC。只要确保你明白了权衡。您的编解码器将针对延迟进行优化,而不是质量...因此您的质量将受到影响。基于UDP的WebRTC(可选但常见)意味着某些数据包将丢失,导致您的观看体验受损。当你关心等待时间时,如果你在这里或那里失去了一块,那并不重要,重要的是你继续前进。您可以使用TCP上的WebRTC,并保持您的可靠性,但延迟稍有增加。

决定什么对你很重要。在几乎所有情况下,它都不是低延迟。你不能拥有所有的方式。每种方法都有权衡。你必须决定什么是最适合你的具体情况。

+0

嗨,对不起,我真的回复晚。感谢您的解释,但对于第二个问题,我的意思是我们可以尽可能接近流光标时间戳吗?在同一时间不是同一件事。因为我现在拥有的东西,每当新人观看时,它将从流的开始处开始,而不是最接近它的地方 –

2

我也有与VLC媒体播放器相同的问题。大部分延迟是由客户端播放器执行的,您可以使用ffplayer而不使用缓冲区来检查它。矿的

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

结果,

  • VLC的延迟:ffplay 6〜7S
  • 延迟:500ms的

有关详细参阅comment of narlex of issue how to reduce latency在github

+1

SRS比nginx-rtmp更加稳定和快速。我测试它,flv和rtmp都没有更多的1s延迟。 –

1

您可能需要更改GOP si ze在ffmpeg命令中。 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;