首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >低延迟破折号

低延迟破折号
EN

Stack Overflow用户
提问于 2017-05-09 11:47:10
回答 3查看 17.9K关注 0票数 5

我在媒体服务器上使用arut nginx模块(https://github.com/arut/nginx-rtmp-module),然后尝试使用FFmpeg流到dash应用程序,然后使用VLC对流进行测试。

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

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

代码语言:javascript
复制
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;
        }
    }
}

这是我用于流的命令

代码语言:javascript
复制
ffmpeg -re -i 2014\ SPRING.mp4 -c copy -f flv 
rtmp://52.221.221.163:1935/dash/spring

我如何减少延迟,并使它从相同的时间戳与彩带?

我能实现5s以下的延迟吗?

更新

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

代码语言:javascript
复制
dash_playlist_length 10s;
dash_fragment 2s;

但还是有一些延迟问题,有时比以前小,有时也一样

EN

回答 3

Stack Overflow用户

发布于 2017-05-10 14:32:24

我能实现5s以下的延迟吗?

不是的。破折号是一个分段的协议,意味着你的媒体被分割成相对大的块。播放器必须下载一些块,然后才能开始播放。您的编码器必须在这些块甚至出现在清单中之前上载整个块。这是一个错误的工作工具,任何通过调整块大小来减少延迟的尝试都会给您的项目增加巨大的开销。如果延迟对您的很重要,那么您将错误地使用工具。

我如何减少延迟,并使它从相同的时间戳与彩带?

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

您能做的最好的就是切换到一个为低延迟而设计的协议,比如WebRTC。确保你能理解这些权衡。你的编解码器会根据延迟而不是质量进行优化.这样你的素质就会受损。UDP上的WebRTC (可选但常见的)意味着一些数据包将丢失,导致您的查看体验受到影响。当你关心延迟的时候,如果你在这里或那里失去了一块,那么重要的是你要继续前进。您可以在TCP上使用WebRTC,并将您的可靠性保持在稍微增加延迟的情况下。

决定对你真正重要的是什么。在几乎每一种情况下,它实际上并不是低延迟。你不可能拥有所有的方式。每一种方法都有取舍。你必须决定什么是最适合你的具体情况。

票数 9
EN

Stack Overflow用户

发布于 2017-07-28 09:48:29

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

代码语言:javascript
复制
ffplay -fflags nobuffer rtmp://192.168.1.66/myapp/live

结果,

  • VLC的延迟: 6~7s
  • 播放延迟:500 of

有关更多信息,请参阅github上的浅谈如何减少延迟

票数 6
EN

Stack Overflow用户

发布于 2017-08-03 09:10:56

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

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

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

代码语言:javascript
复制
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;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43868982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档