实验项目三 推流
项目比较核心的一块,但主要内容在与软件的使用。直播项目分为采集、编码、推流、拉流、解码以及过程间的处理。这个项目的采集、编码、推流用ffmpeg实现,拉流、解码用B站开源的flv.js实现。
比较系统的ffmpeg的介绍见CSDN,下面还会提到。flv.js项目见GitHub。
Part1 Nginx
Nginx用来作流媒体服务器。流媒体再传播过程中的协议有许多种类,这个项目采用的是HTTP-FLV,理由很简单,RTMP用不了了,HLS受众小。
Nginx官网下载的包并不支持采用的HTTP-FLV,需要将第三方模块nginx-http-flv-module编译进去。该模块介绍见CSDN,项目见GitHub。
Part1.1 编译支持nginx-http-flv-module的Nginx
步骤参考CSDN。
遇到的问题:
▶auto/configure失败
▷版本号未对应,修改指令即可
▶warning C4047: “return”:“const char *”与“int”的间接级别不同
▷参考CSDN,将return(cflags); 改成 return(CFLAGS);即可
▶error LNK2019: 无法解析的外部符号 ___iob_func,该符号在函数 _main 中被引用
▷原因经搜索应该是VS版本更新带来的包引用出问题,碍于软件水平不到位,暂用现成项目。
编译完成后,使用前需要对Nginx配置文件:Nginx.conf进行配置,详解见CSDN
event{}
http{}
rtmp{ #即rtmp服务器
paramerter
server{
listing
application{}
}
}
服务器配置好并应用后,开启服务器即可进行推拉流的尝试了:
// push ffmpeg -re -i test1.mp4 -vcodec h264 -f flv rtmp://localhost:1935/http_flv/vedio
// -i 后面跟输入 最后是输出,其余都是参数。ffmpeg的退出指令是q,不过ctrl+c显示的也是正常退出。
// pull http://localhost:8080/live?port=1935&app=http_flv&stream=vedio
// 8080是Nginx的http服务监听的端口,live是http服务中location,port后面跟rtmp监听的端口,app对应rtmp服务中的应用,流名称自定义。
// or
rtmp://localhost:1935/http_flv/vedio
// 需要支持rtmp域
Part2 构建flv.js和flv.min.js
详见Github中Install和Build部分
遇到的问题
▶Assertion `args[1]->IsString()' failed.
▷参考CSDN
▷gulp版本太低,故更新gulp版本npm install --save-dev gulp@4
▶AssertionError [ERR_ASSERTION]: Task function must be specified
▷gulp版本4.0更换源码,部分代码不符合规范,可修改代码块或者改用gulp3。大无语事件发生了!!!
▶ReferenceError:primordials is not defined
-node版本高,用nvm工具更换到11.15.0
▶Empty block statement no-empty
OR Missing whitespace after semicolon semi-spacing
OR Unnecessary semicolon no-extra-semi
▷打开对应js文件,修改错误问题即可
构造完毕后,在项目中导入flv.js即可使用了,可以通过魔改官方提供的Demo偷懒
Part3 推流到flv.js
可以直接再官方demo中适用。解析器不支持rtmp域所以需要用http开头的地址拉流。
推流若无audio不能开hasAudio按钮,否则无限加载
延迟3-10s都遇到过
2021年6月23日
14点06分
H40Y

浙公网安备 33010602011771号