本文将介绍如何在 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 举报,一经查实,本站将立刻删除。