首页| 论坛| 消息
主题:Qt/C++音视频开发79-采集websocket视频流/打开ws开头的地址/音视频同步/保存到MP4文件/视频回放
liudianwu发表于 2024-07-23 07:56
## 一、前言
随着音视频的爆发式的增长,各种推拉流应用场景应运而生,基本上都要求各个端都能查看实时视频流,比如PC端、手机端、网页端,在网页端用websocket来接收并解码实时视频流显示,是一个非常常规的场景,单纯的http-flv模式受限于最大6个通道同时显示,一般会选择ws-flv也就是websocket的flv视频流,这种突破了6个的限制,而且实时性很好,音视频也都有,264/265都支持,webrtc不支持265很恼火,现在这么多265摄像头,尽管webrtc实时性最好,但是不支持265这一点,就几乎少掉一大半用户,尤其是视频监控行业。
以前也就思考过,既然是264/265的视频流过来,收到后用ffmpeg直接解码应该就可以播放,受限于之前的认知有限,以为一定要一个打开的地址才行,比如ffmpeg中常规操作就是avformat_open_input中填入一个地址,这个地址可以是本地音视频文件,也可以是网络视频流等,反正要有一个地址才行。直到近期要解决如何采集ws://这种地址的视频流的时候,才彻底静下心来研究这一块。原来ffmpeg从ffmpeg2开始就一直有这个机制,并不是一定要地址的,也可以是内存中的数据,需要定义一个AVIOContext对象,然后将formatCtx->pb赋值就完事,那边通过avio_alloc_context的回调函数获取数据即可。你只需要打开websocket收到数据,往缓存接口存数据就好,ffmpeg在调用打开也好读取av_read_frame也好,都会从缓存数据中取数据,取到数据就去解码。也就是在原来的代码基础上,加上少量的几十行代码就好,整个解码机制完全不变,硬解码也不用变,真舒服真完美,不得不佩服ffmpeg的设计,天才接口设计。
## 二、效果图

## 三、体验地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
4. 体验地址:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf 文件名:bin_video_demo。
5. 视频主页:[https://space.bilibili.com/687803542](https://space.bilibili.com/687803542)
## 四、功能特点
### 4.1. 基础功能
1. 支持各种音频视频文件格式,比如mp3、wav、mp4、asf、rm、rmvb、mkv等。
2. 支持本地摄像头设备和本地桌面采集,支持多设备和多屏幕。
3. 支持各种视频流格式,比如rtp、rtsp、rtmp、http、udp等。
4. 本地音视频文件和网络音视频文件,自动识别文件长度、播放进度、音量大小、静音状态等。
5. 文件可以指定播放位置、调节音量大小、设置静音状态等。
6. 支持倍速播放文件,可选0.5倍、1.0倍、2.5倍、5.0倍等速度,相当于慢放和快放。
7. 支持开始播放、停止播放、暂停播放、继续播放。
8. 支持抓拍截图,可指定文件路径,可选抓拍完成是否自动显示预览。
9. 支持录像存储,手动开始录像、停止录像,部分内核支持暂停录像后继续录像,跳过不需要录像的部分。
10. 支持无感知切换循环播放、自动重连等机制。
11. 提供播放成功、播放完成、收到解码图片、收到抓拍图片、视频尺寸变化、录像状态变化等信号。
12. 多线程处理,一个解码一个线程,不卡主界面。
### 4.2. 特色功能
1. 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6)、ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc内核(vlc2/vlc3)、mpv内核(mpv1/mp2)、mdk内核、海康sdk、easyplayer内核等。
2. 非常完善的多重基类设计,新增一种解码内核只需要实现极少的代码量,就可以应用整套机制,极易拓展。
3. 同时支持多种画面显示策略,自动调整(原始分辨率小于显示控件尺寸则按照原始分辨率大小显示,否则等比缩放)、等比缩放(永远等比缩放)、拉伸填充(永远拉伸填充)。所有内核和所有视频显示模式下都支持三种画面显示策略。
4. 同时支持多种视频显示模式,句柄模式(传入控件句柄交给对方绘制控制)、绘制模式(回调拿到数据后转成QImage用QPainter绘制)、GPU模式(回调拿到数据后转成yuv用QOpenglWidget绘制)。
5. 支持多种硬件加速类型,ffmpeg可选dxva2、d3d11va等,vlc可选any、dxva2、d3d11va,mpv可选auto、dxva2、d3d11va,mdk可选dxva2、d3d11va、cuda、mft等。不同的系统环境有不同的类型选择,比如linux系统有vaapi、vdpau,macos系统有videotoolbox。
6. 解码线程和显示窗体分离,可指定任意解码内核挂载到任意显示窗体,动态切换。
7. 支持共享解码线程,默认开启并且自动处理,当识别到相同的视频地址,共享一个解码线程,在网络视频环境中可以大大节约网络流量以及对方设备的推流压力。国内顶尖视频

浏览大图
下一页 (1/5)
回帖(0):

全部回帖(0)»
最新回帖
收藏本帖
发新帖