标题:Qt编写ffmpeg本地摄像头显示(16路本地摄像头占用3.2%CPU)
作者:liudianwu
日期:2022-11-10 09:06
内容:
## 一、前言
内核ffmpeg除了支持本地文件、网络文件、各种视频流播放以外,还支持打开本地摄像头,和正常的解析流程一致,唯一的区别就是在avformat_open_input第三个参数传入个AVInputFormat参数,这个参数用于指定输入设备的格式,不同系统对应不同的格式名称,windows上是dshow或者vfwcap,linux上是video4linux2或者v4l2,mac上是avfoundation。同时本地摄像头涉及到分辨率帧率等参数的设置,这个需要在最开始调用av_dict_set的时候就设置好,用video_size来设置分辨率,格式是 640x480 这样,用framerate来设置帧率,以上的几个参数成功生效的前提是要设备本身支持对应的分辨率帧率等,比如设备本身只有720P你硬是要设置个1080P的分辨率那肯定不行的,应该会打印I/O error这类错误提示。
这里有个插曲要说下,老早以前就用ffmpeg打开了本地摄像头解析,是在windows上实现的,尽管其他系统也设置了对应的格式,但是始终无法打开,要注意两点,第一点就是必须用动态库,静态库的ffmpeg中默认无法继承本地摄像头的支持,所以在编译期间就会报错。第二点就是填入的url地址是不需要video=开头的,在windows上需要用video=开头,所以要做个区分处理,比如windows上是 video=USB Video Device,而linux上直接是 /dev/video0 。
## 二、功能特点
### 2.1 基础功能
1. 支持各种音频视频文件格式,比如mp3、wav、mp4、asf、rm、rmvb、mkv等。
2. 支持本地摄像头设备,可指定分辨率、帧率。
3. 支持各种视频流格式,比如rtp、rtsp、rtmp、http等。
4. 本地音视频文件和网络音视频文件,自动识别文件长度、播放进度、音量大小、静音状态等。
5. 文件可以指定播放位置、调节音量大小、设置静音状态等。
6. 支持倍速播放文件,可选0.5倍、1.0倍、2.5倍、5.0倍等速度,相当于慢放和快放。
7. 支持开始播放、停止播放、暂停播放、继续播放。
8. 支持抓拍截图,可指定文件路径,可选抓拍完成是否自动显示预览。
8. 支持录像存储,手动开始录像、停止录像,部分内核支持暂停录像后继续录像,跳过不需要录像的部分。
9. 支持无感知切换循环播放、自动重连等机制。
10. 提供播放成功、播放完成、收到解码图片、收到抓拍图片、视频尺寸变化、录像状态变化等信号。
11. 多线程处理,一个解码一个线程,不卡主界面。
### 2.2 特色功能
1. 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6)、ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5) ..