我在媒体服务器上使用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;
但仍有一些延迟问题,有时它比以前小,有时它是相同的
答案 0 :(得分:5)
我可以达到5秒以下的延迟吗?
没有。 DASH是一种分段协议,意味着您的媒体被切割成相对较大的块。玩家必须先下载一些块才能开始播放它们。您的编码器必须在这些块甚至出现在清单中之前上传整个块。这是工作的错误工具,任何通过降低块大小来减少延迟的尝试都会给项目增加大量开销。如果延迟对您很重要,那么您正在使用错误的工具。
如何减少延迟,并使其与流媒体的时间戳相同?
你做不到。物理!你不可能在编码的同时播放同样的东西。您通过分组交换网络发送数据,其中许多编码/解码步骤都需要缓冲区,因为它们以块的形式工作。回放同时播放内容的唯一方法就是模拟...至少在那里你唯一的延迟就是光速。
您可以做的最好的事情是切换到专为低延迟而设计的协议,例如WebRTC。只要确定你理解权衡。您的编解码器将针对延迟而非质量进行优化...因此您的质量将受到影响。 WebRTC over UDP(可选但常见)意味着某些数据包会丢失,导致您的观看体验受损。当你关心延迟时,如果你在这里或那里丢失了一块,那么重要的是你继续前进。您可以通过TCP使用WebRTC,并使您的可靠性仅略微增加延迟。
决定对你真正重要的事情。几乎在所有情况下,实际上并不是低延迟。你无法全力以赴。每种方法都有权衡。您必须决定什么是最适合您的具体情况。
答案 1 :(得分:4)
我对VLC媒体播放器也有同样的问题。大多数延迟是由客户端播放器,您可以使用没有缓冲区的ffplayer来检查它。
ffplay -fflags nobuffer rtmp://192.168.1.66/myapp/live
我的结果,
有关更多信息,请参阅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;