大疆上云api直播功能如何实现
概述
流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下:
- 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用
- 约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流媒体应用的唯一标识为 live01,那么我们可以约定推拉流地址为 rtmp://ip:1935/live01/{camera_id} ,其中camera_id 为唯一标识,用于区分每一个相机 。针对相机A的推拉流地址可以为:rtmp://ip:1935/live01/camera-A,同理针对相机B的推拉流地址可以为:rtmp://ip:1935/live01/camera-B
- 推流端向 推拉流地址 推送直播流
- 拉流端从 推拉流地址 拉取直播流播放
出于技术调研的目的,将使用OBS作为上述流程中的推流端;将使用Nginx作为上述流程中的流媒体服务器;将使用ffplay、VLC、flv.js作为上述流程中的拉流端。那么整个流程的落地实践就变成了:
- 使用Nginx搭建流媒体服务器,需要基于源码编译 nginx-http-flv-module 模块
- 在nginx.conf 中创建媒体应用,并做相应的配置,包括对hls(即m3u8)的支持,http-flv的支持
- 约定推拉流的地址
- OBS向推拉流地址推送流
- ffplay拉取直播画面并播放,rtmp协议
- VLC拉取直播画面并播放,rtmp协议、hls协议
- 使用基于flv.js 的视频播放器播放直播画面,http协议
基于源码编译安装nginx-http-flv-module
参考之前写的:使用Nginx搭建流媒体服务器
创建流媒体应用
当安装好了 nginx-http-flv-module 之后,就可以创建流媒体应用了。
所谓的创建流媒体应用其实就是编写 nginx 的配置文件,如果需要创建一个名为live 的流媒体应用,那么可以在nginx.conf 中做如下配置:
# 以下内容放可在 nginx.conf 的最后,rtmp 配置块为顶级配置块
rtmp_auto_push on ;
rtmp {
server {
listen 1935; #监听的端口
notify_method get;
chunk_size 4000;
application live { #rtmp推流请求路径
live on;
# 添加 hls 支持
hls on;
hls_path /usr/local/nginx/html/hls;
hls_fragment 3;
hls_playlist_length 60;
# 允许从任何源push 流
allow publish all ;
# 允许从任何地方来播放流
allow play all;
# 20s内没有push,就断开连接
drop_idle_publisher 20s ;
}
}
}
- listen 1935:指定流媒体服务器的运行端口
- live :为流媒体应用的应用的名称,也即流媒体应用的唯一标识
- live on : 添加直播的支持
- hls_path:指定生成的m3u8文件的位置
创建http-flv端点和hls端点
创建http-flv端点和hls端点的目的是让直播流可以在http协议上面传输直播画面。
若不创建,将仅可以使用rtmp协议拉流,即rtmp://ip:1935/live/stream_no;若创建了就可以使用hls或者flvjs来拉流播放了。
创建http-flv端点和hls端点同样是编辑nginx.conf来实现,如下示例配置:
http {
......
server {
listen 82;
server_name rtmpserver;
# 创建hls端点
location /hls {
add_header 'Access-Control-Allow-Origin' '*' ;
add_