1、rtmp服务器
整个直播的功能分成下面三个模块:
截屏2022-09-08 下午9.49.50.png
从上图我们可以看到rtmp是需要服务器做转发的,我们选用开源的srs.直接从github上把它的源码拉下来编译,然后直接启动即可:
git clone git@github.com:ossrs/srs.git
cd srs/trunk
./configure
make
./etc/init.d/srs start
如果是本地的电脑,这个时候就能在局域网内直接用它的内网ip去访问了.但如果是腾讯云、阿里云之类的云服务器还需要配置安全组开放下面几个端口的访问权限:
listen 1935;
max_connections 1000;
#srs_log_tank file;
#srs_log_file ./objs/srs.log;
daemon on;
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
rtc_server {
enabledon;
listen8000; #UDPport
#@seehttps://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate
candidate$CANDIDATE;
}
...
当然如果这几个端口已经被占用的话可以修改配置文件conf/srs.conf去修改
服务器到这里就准备好了,浏览器访问下面网址对srs进行调试、配置:
http://服务器ip:8080/players/rtc_publisher.html http://服务器ip:1985/console/ng_index.html
2、推流
2.1准备输出流
我们选择推送本地的视频到rtmp服务器,所以第一步仍然是打开本地视频流:
boolVideoSender::Send(conststring&srcUrl, conststring&destUrl) {
...
// 打开文件流读取文件头解析出视频信息如轨道信息、时长等
// mFormatContext初始化为NULL,如果打开成功,它会被设置成非NULL的值
// 这个方法实际可以打开多种来源的数据,url可以是本地路径、rtmp地址等
// 在不需要的时候通过avformat_close_input关闭文件流
if(avformat_open_input(&inputFormatContext, srcUrl.c_str(), NULL, NULL) <0) {
cout<<"open "<<srcUrl<<" failed"<<endl;