如何使用 NGINX 设置 HLS 直播服务器

本文将介绍如何在 ubuntu 上设置自己的流媒体服务器。

1. 编译nginx带rtmp模块

首先,我们需要用 nginx-rtmp-module 编译nginx。

我们建议使用 https://github.com/sergey-dryabzhinsky/nginx-rtmp-module 分叉模块。它正在积极开发中,与原始模块相比,包含了更多修正和改进。

克隆 nginx-rtmp-module

git clone https://github.com/sergey-dryabzhinsky/nginx-rtmp-module.git

安装 nginx 依赖项

sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev

下载 nginx

地址:https://nginx.org/en/download.html

编译nginx

./configure --with-http_ssl_module --add-module=../nginx-rtmp-module 
make -j 1 
sudo make install
  • 注意--add-module=../nginx-rtmp-module参数,路径必须正确指向克隆的模块
  • (可选)将 -j 1 替换为您计算机上的 cpu 数量以加速编译

2. 创建 nginx 配置文件

rtmp 模块配置

nginx中的应用程序意味着一个rtmp端点。

基本 uri 语法:rtmp://nginx_host[:nginx_port]/app_name/stream_name
我们将使用stream作为流名称,因此我们的端点将是:

rtmp://localhost/show/stream随后将作为http://localhost:8080/hls/stream.m3u8

为了获得良好的 HLS 体验,我们建议使用 3 秒片段和 60 秒播放列表。

rtmp {
    server {
        listen 1935; # Listen on standard RTMP port
        chunk_size 4000;

        application show {
            live on;
            # Turn on HLS
            hls on;
            hls_path /mnt/hls/;
            hls_fragment 3;
            hls_playlist_length 60;
            # disable consuming the stream from nginx as rtmp
            deny play all;
        }
    }
}

请注意,示例将 /mnt/hls/ 作为 hls 播放列表和视频文件的目标路径。

你可以将其改为其他目录,但要确保nginx有写入权限。

http 服务器配置

由于 HLS 由静态文件组成,因此只需添加正确的 MIME 类型和 CORS 标头这两项配置,就能建立一个简单的 http 服务器。

server {
    listen 8080;

    location /hls {
        # Disable cache
        add_header Cache-Control no-cache;

        # CORS setup
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length';

        # allow CORS preflight requests
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
        }

        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }

        root /mnt/;
    }
}

完整的 nginx.conf

nginx conf 的默认位置是/usr/local/nginx/conf/nginx.conf/etc/nginx/nginx.conf

worker_processes  auto;
events {
    worker_connections  1024;
}

# RTMP configuration
rtmp {
    server {
        listen 1935; # Listen on standard RTMP port
        chunk_size 4000;

        application show {
            live on;
            # Turn on HLS
            hls on;
            hls_path /mnt/hls/;
            hls_fragment 3;
            hls_playlist_length 60;
            # disable consuming the stream from nginx as rtmp
            deny play all;
        }
    }
}

http {
    sendfile off;
    tcp_nopush on;
    aio on;
    directio 512;
    default_type application/octet-stream;

    server {
        listen 8080;

        location / {
            # Disable cache
            add_header 'Cache-Control' 'no-cache';

            # CORS setup
            add_header 'Access-Control-Allow-Origin' '*' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length';

            # allow CORS preflight requests
            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;
                return 204;
            }

            types {
                application/dash+xml mpd;
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }

            root /mnt/;
        }
    }
}

3. 启动nginx

nginx二进制文件位于编译后的位置,默认为/usr/local/nginx/sbin/nginx。请根据自己的路径进行更改。

测试配置文件:

/usr/local/nginx/sbin/nginx -t

在后台启动 nginx:

/usr/local/nginx/sbin/nginx

在前台启动nginx:

/usr/local/nginx/sbin/nginx -g 'daemon off;'

随时随地重新加载配置(正常重启)

/usr/local/nginx/sbin/nginx -t && nginx -s reload

关闭 nginx:

/usr/local/nginx/sbin/nginx -s stop

4. 使用 rtmp 向 nginx 推送实时流

nginx接受rtmp流作为输入。对于正确的 HLS 流,视频编解码器应为 aac/mp3/ac3,音频编解码器通常为 aac。

选项 1:从已有的 h264 rtmp 流中提取

如果已有编解码器正确的 rtmp 流,可以跳过 ffmpeg,直接告诉 nginx 拉取该流。为此,请在nginx.conf的应用程序部分添加一个pull指令,如下所示:

application show {
    live on;
    pull rtmp://example.com:4567/sports/channel3 live=1;
    # to change the local stream name use this syntax: ... live=1 name=ch3; 

    # other directives...
    # hls_...
}

选项 2:来自本地网络摄像头/不同的 rtmp/文件

为了实现流编码和多路复用,我们将使用万能的 ffmpeg。要使用 PPA 安装 ffmpeg,请运行以下命令:

sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get update
sudo apt-get install ffmpeg

可以通过多种来源生成 rtmp 流。以下是几个例子: 将localhost更新为nginx服务器IP/域名。

捕获/dev/video0上的网络摄像头,并将其流到nginx上:

ffmpeg -re -f video4linux2 -i /dev/video0 -vcodec libx264 -vprofile baseline -acodec aac -strict -2 -f flv rtmp://localhost/show/stream
  • -re– 以媒体的原始比特率(而不是尽可能快的比特率)消费数据流
  • -f– 使用video4linux2插件
  • -i– 选择要捕获的物理设备
  • -vcodec– 指定要输出的视频编解码器
  • -vprofile– 使用 x264 基线配置文件
  • -acodec– 使用aac音频编解码器
  • -strict– 允许使用实验性的 aac 编解码器
  • -f– 指定输出格式
  • rtmp://localhost/show/stream– 要流式传输的 rtmp 端点。如果目标端口不是 1935,则应包含在 uri 中。

最后一个路径组件是流名称–这意味着可以使用不同的名称推送多个频道。

流文件 example-vid.mp4:

ffmpeg -re -i example-vid.mp4 -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv rtmp://localhost/show/stream

另一个 rtmp 流:

 ffmpeg -i rtmp://example.com/appname/streamname -vcodec libx264 -vprofile baseline -acodec aac -strict -2 -f flv rtmp://localhost/show/stream

5. 对服务器进行测试运行!

现在,我们将流媒体推送到 nginx,在目标文件夹中创建了一个格式为 stream-name.m3u8 的清单文件,同时还创建了视频片段。

在我们的示例中,清单可在以下位置获取:

http://localhost:8080/hls/stream.m3u8

为了测试我们新的 HLS 直播,我们将使用videojs5。

player.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Live Streaming</title>
    <link href="//vjs.zencdn.net/5.8/video-js.min.css" rel="stylesheet">
    <script src="//vjs.zencdn.net/5.8/video.min.js"></script>
</head>
<body>
<video id="player" class="video-js vjs-default-skin" height="360" width="640" controls preload="none">
    <source src="http://localhost:8080/hls/stream.m3u8" type="application/x-mpegURL" />
</video>
<script>
    var player = videojs('#player');
</script>
</body>
</html>

运行正常!

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论