首页| 论坛| 消息
主题:Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等
liudianwu发表于 2024-03-12 08:43
## 一、前言
用ffmpeg做音视频保存到mp4文件,都会遇到一个问题,尤其是在视频监控行业,就是监控摄像头设置的音频是PCM/G711A/G711U,解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw,将这个原始的音频流保存到mp4文件是会报错的,在调用avformat_write_header写文件头的时候提示(-22) Invalid argument,非法的参数,翻阅源码得知,ffmpeg中的mp4封装并不支持pcma和pcmu,除非手动更改源码加入。mp4封装格式默认支持的音频格式是aac和mp3,其实mp4文件本身是可以支持pcm音频数据的,不知道为何ffmpeg中不加入。通过个更改源码的形式尽管可以支持,个人还是推荐用另外一种方法,那就是在调用avformat_alloc_output_context2的时候传入format的时候填mov,而不是填mp4,mov的格式兼容性更强,文件拓展名依然是mp4一点问题没有。对应avformat_alloc_output_context2函数的说明,format格式参数可以为空,为空的话默认从保存的文件名拓展名取,而如果指定了则以指定的为准。
既然以mov格式存储到mp4文件,那么问题来了,会不会导致文件体积或者格式不兼容呢?一开始我也是有这个担心的,特意找了多个厂家的摄像头专门测试,发现根本没有体积变化,所以个人猜测,填mov只是为了方便跳过检测,MOV文件可以使用多种编码格式,包括MPEG-4、H.264、MJPEG等;而MP4文件主要使用H.264编码。
上面的不仅支持264,同时也支持265,也就是mov格式同时支持264+aac/264+mp3/264+pcm/264+pcma/264+pcmu/265+aac/265+mp3/265+pcm/265+pcma/265+pcmu,这样原始数据保存到文件最好,不用转码重新编码,可以省下不少的CPU,写文件基本上不占CPU,基本上都是磁盘操作,所以性能瓶颈在磁盘读写能力和网络带宽。
## 二、效果图

## 三、体验地址
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/4)
回帖(0):

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