Nginx 从+;30秒

Nginx 从+;30秒,nginx,http-live-streaming,avconv,Nginx,Http Live Streaming,Avconv,Ubuntu 12.04 nginx 1.2.4 avconv-版本 avconv version 0.8.10-4:0.8.10-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers built on Feb 6 2014 20:56:59 with gcc 4.6.3 avconv 0.8.10-4:0.8.10-0ubuntu0.12.04.1 libavutil 51. 22. 2 / 51. 22. 2

Ubuntu 12.04

nginx 1.2.4

avconv-版本

avconv version 0.8.10-4:0.8.10-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
  built on Feb  6 2014 20:56:59 with gcc 4.6.3
avconv 0.8.10-4:0.8.10-0ubuntu0.12.04.1
libavutil    51. 22. 2 / 51. 22. 2
libavcodec   53. 35. 0 / 53. 35. 0
libavformat  53. 21. 1 / 53. 21. 1
libavdevice  53.  2. 0 / 53.  2. 0
libavfilter   2. 15. 0 /  2. 15. 0
libswscale    2.  1. 0 /  2.  1. 0
libpostproc  52.  0. 0 / 52.  0. 0
我正在使用avconv和nginx创建HLS流,但现在我的延迟通常超过30秒。经过大量阅读,我意识到HLS内置了延迟,10秒是预期的,甚至是首选,但30秒似乎非常极端

我看到了很多关于nginx-rtmp-google组的讨论,特别是thread有很多建议。我试图通过减少
hls\u片段
hls\u播放列表长度
来减少并解决我的问题,但没有产生显著效果

nginx.conf:

#user  nobody;
worker_processes  1;

error_log  logs/error.log debug;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       8888;
        server_name  localhost;

        add_header 'Access-Control-Allow-Origin' "*";

        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
        }

        # rtmp stat
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            # you can move stat.xsl to a different location
            root /usr/build/nginx-rtmp-module;
        }

        # rtmp control
        location /control {
            rtmp_control all;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

rtmp {
    server {
        listen 1935;
        ping 30s;
        notify_method get;

        application myapp {
            live on;

            hls on;
            hls_path /tmp/hls;
            hls_base_url http://x.x.x.x:8888/hls/;
            hls_sync 2ms;
            hls_fragment 2s;

            #hls_variant _low BANDWIDTH=160000;
            #hls_variant _mid BANDWIDTH=320000;
            #hls_variant _hi BANDWIDTH=640000;
        }
    }
}
avconv命令:

avconv -r 30 -y -f image2pipe -codec:v mjpeg -i - -f flv -codec:v libx264 -profile:v baseline -preset ultrafast -tune zerolatency -an -f flv rtmp://127.0.0.1:1935/myapp/mystream
编辑


我知道瓶颈不是avconv,因为我还使用nginx生成RTMP流。这个RTMP流有一个非常小的延迟(几秒钟)。

我曾经遇到过同样的问题。我在nginx.conf中添加了两个参数,然后延迟被减少到10秒甚至更少。这是我的配置文件:

    application hls {
        hls_playlist_length 4s; 
        hls_fragment 1s
    }

然而,我不得不说10秒似乎是我们的极限。有更好的解决方案吗?

答案是将hls\u播放列表减少到4,将hls\u片段减少到1。但是,需要注意的是,如果源视频的关键帧间隔大于hls_片段长度,则nginx通常必须创建更长的片段,延迟将增加


我们获得的最低延迟是hls_片段为1s,源视频关键帧间隔也为1s。通过这些设置,我们实现了小于7秒的延迟。

如您所见,HLS的本质是高延迟。30秒并不极端。。。这很常见。当YouTube进行现场直播时,通常会延迟几分钟(尽管他们有一个更大的网络可供分发)。你发现的建议也是正确的。如果它们对延迟没有影响,那么问题可能出在编码端。从等式中去掉HLS部分,并尝试立即播放来自avconv/FFmpeg的数据。测量延迟。它应该是一秒或更短,但你永远不知道。我当前的设置生成两个流,一个使用HLS,另一个使用RTMP,RTMP流有一个非常小的延迟(可能是几秒钟)。@Rick我看到你现在使用的是nodejs,这可能很有趣,但不幸的是,我相信iOS要求您使用HLS进行流媒体传输,否则RTMP可能是我的首选。你现在的延迟怎么样?@PanamaJack-Caveat,我已经好几年没有参与这个项目了。我不认为IOS是个问题,我们使用nodejs来流,然后使用JS解码器库将帧写入HTML5画布。延迟很好(几秒钟),我们不能使用RTMP,因为这需要浏览器中的flash播放器,它不能让您访问单个帧(我们需要)。请注意,在我上一次做这项工作的几年中,这一切都可能发生变化。最终,我们完全放弃了HLS,转而使用nodejs服务器,通过套接字传递帧。我觉得这更像是一个评论,而不是一个答案。我之所以给出这个答案,是因为您必须将源关键帧间隔设置为一个较低的值,否则您的延迟将不会像原始问题所期望的那样低于10秒(我不允许添加评论,否则我如何才能做出这一尚未明确提及的重要区别?)@brod您是如何更改源视频关键帧间隔的?我正在尝试使用
hls.js
在浏览器中进行流式传输,但尚未找到实现此目的的方法。@hoodsy需要对生成视频的任何内容进行设置。为了进行测试,您可以尝试在平板电脑上使用Larix广播应用程序。Larix广播允许您更改视频关键帧间隔:在使用OBS或vmix时也可以。