背景
之前在IE时代,安防播放视频都是采用activeX +rtsp的方式;chrome+firefox 使用npapi的控件 或者chrome、firefox采用flash + rtmp;
但后来chrome去掉了npaip和flash的支持。
这里主要讲解如何在chrome中进行无控件播放实时视频
PC 用flv.js 播放http-flv流
web用video.js 播放http-hls流
相关知识
先阅读以下文章
https://cloud.tencent.com/developer/article/1467813
https://www.cnblogs.com/upyun/p/9881865.html
无控件实时播放就是http+hls 、 http-flv 、webassembly的方式,但hls需要m3u8分片,延时会比flv大
我的需求只要能够在chrome上低延时无控件播放h264码流,简单点所以并没有采用ffmpeg+webAssembly的技术,而是采用http-flv的方式。
基本原理
通过rtsp从ipc引流,经ffmpeg转码为rtmp到nginx-http-flv-module,
前端通过flv.js 进行引流播放,达到低延时、秒开的效果。
环境搭建
http://nginx.org/en/download.html
https://github.com/winshining/nginx-http-flv-module
https://github.com/bilibili/flv.js
https://github.com/FFmpeg/FFmpeg/tree/release/4.3
nginx + http-flv-module 编译
1 | yum install gcc-c++ zlib zlib-devel pcre pcre-devel zlib zlib-devel openssl openssl-devel -y |
ffmpeg 编译
1 | 首先安装yasm插件 |
flv.js 部署
在 https://github.com/bilibili/flv.js/tree/master/demo
下载 index.html 和 demo.css ,并修改index.html 中flv.js 路径
通过 http://bilibili.github.io/flv.js/demo/ 查看源代码,并在flv.js/dist 中下载 flv.js
以上三个文件放置在 nginx/html下
nginx conf设置
1 |
|
测试 rtmp、http-flv
启动nginx ,然后执行
1 | ffmpeg -re -i yxjx.mp4 -vcodec copy -an -f flv rtmp://localhost:1935/live/steam |
打开vlc 网络分别输入:
1 | http://192.168.50.200:8080/live?port=1935&app=live&stream=steam |
视频正常播放
打开网站
1 | http://192.168.50.200:8080/ 输入 |
测试 hls
使用video.js 测试
video.html
1 | <!DOCTYPE html> |
ffmpeg 地址修改为
1 | ffmpeg -re -i yxjx.mp4 -vcodec copy -an -f flv rtmp://localhost:1935/hls/steam |
手机打开 http://192.168.50.200:8080/video.html 播放正常
遇到的问题
ffmepg 转码性能
我们对于大部分码流只要转封装即可,不需要进行转码,命令行参数
ffmpeg -i rtsp://admin:admin@192.168.1.10:554/video -vcodec copy -acodec copy -f flv rtmp://localhost:1935/live/steam
ffmepg 转码失败
我遇到音频的问题,ffmepg转码时有错误日志输出,可以查看具体原因;我不需要音频所以就去掉音频;
1 | [flv @ 0x3a1c600] FLV does not support sample rate 48000, choose from (44100, 22050, 11025) |
1 | rtsp 转换 |
1 | 文件,需要 -re 按正常帧率推送 |
音频的支持
flv 格式支持
1 | 0 = Linear PCM, platform endian |
转码时,就支持声音播放了
1 | ffmpeg -re -i yxjx.mp4 -vcodec copy -acodec aac -f flv rtmp://localhost:1935/live/steam |
flv.js 延时问题
在创建flv player时,设置参数
1 | player = flvjs.createPlayer(mediaDataSource,{ |
视频秒开问题
gop_cache on; 的作用是缓存了一个GOP视频,所以如果IPC的视频GOP设置为50,那么会有2s的延时;
设置了 gop_cache off; 会有最多2s的黑屏。
抓拍功能
我还得继续研究
后续计划
如果有时间,会考虑使用ffmegp+webAssembly的方法,因为这样播放器能实现更多的功能。