音视频封装、解封装、编解码pipeline
-
音视频解封装(MP4、RTSP)、重采样、编解码、封装(MP4),采用模块化和接口化管理。
-
音频编解码使用纯软方案。
-
视频编解码有三种实现:
- FFmpeg硬编解码(HardDecoder.cpp、H264HardEncoder.cpp),仅支持英伟达显卡,CMakeLists.txt中打开add_definitions(-DUSE_FFMPEG_NVIDIA)。支持软硬编解码自动切换(优先使用硬编解码-不是所有nvidia显卡都支持编解码、不支持则自动切换到软编解码,ffmpeg需要在编译安装的时候添加Nvidia硬编解码功能)。 博客地址:https://blog.csdn.net/weixin_43147845/article/details/136812735
- FFmpeg纯软编解码(SoftDecoder.cpp、H264SoftEncoder.cpp),CMakeLists.txt中打开add_definitions(-DUSE_FFMPEG_SOFT),此时代码可以在任何Linux环境下运行。
- 昇腾显卡DVPP V2版本编解码(DVPPDecoder.cpp、H264DVPPEncoder.cpp、dvpp_enc),CMakeLists.txt中打开昇腾相关的配置。
-
默认是USE_FFMPEG_SOFT,通过设置宏的方式,使用者可以添加适配任意显卡的代码,只要保证类名和被调用的类方法一致即可,平台扩展性好。
-
支持格式,视频:H264/H265,音频:AAC。
-
ffmpeg-nvidia不适用jetson,jetson的编解码库和x86不一样。jetson编解码参考:https://github.com/BreakingY/jetpack-dec-enc
-
昇腾的DVPP有两个版本:V1和V2 ,V1和V2适用不同的平台,请到官网自行查阅,不过昇腾后续的显卡应该都支持V2版本。DVPP视频输入的宽必须是16的整数倍,高必须是2的整数倍,并且DVPP不是所有格式的视频都支持。
-
支持从MP4、RTSP获取音视频。MP4解封装由FFMPEG完成;RTSP客户端纯C++实现,不依赖任何库,地址:https://github.com/BreakingY/simple-rtsp-client
-
代码包含四个模块,如下图所示:
-
采用模块化和接口化的管理方式,可自行组装扩展形成业务pipeline,比如添加视频处理模块、音频处理模块,对解码后的音视频进行处理,例如,AI检测、语音识别等。
-
日志使用的spdlog,地址:https://github.com/gabime/spdlog
-
Bitstream:https://github.com/ireader/avcodec
- 安装ffmpeg到/usr/local下,版本>=4.x 如果没有安装在/usr/local下面请修改CMakeLists.txt,把头文件和库路径添加进去。
- 安装opencv,需要cmake能找到,如果不能请修改CMakeLists.txt,手动指定opencv头文件、库路径及链接的库。
- 昇腾测试时,根据SDK的实际安装路径更改CMakeLists.txt中的配置
- 测试版本 ffmpeg4.0.5、opencv4.5.1、CANN7.0.0(昇腾SDK)。
- mkdir build
- cmake ..
- make -j
- 测试:
- 文件测试:./MediaCodec ../Test/test1.mp4 out.mp4 && ./MediaCodec ../Test/test2.mp4 out.mp4
- rtsp测试:./MediaCodec your_rtsp_url out.mp4
- 昇腾测试:./MediaCodec ../Test/dvpp_venc.mp4 out.mp4
- 解除DVPP视频宽高的限制