感谢雷霄骅博士的在中文视频编解码的付出,http://blog.csdn.net/leixiaohua1020
最近要搞一些视频推流的事情,要解析H264裸流并且获取opencv格式的Mat数据给算法工程师们跑算法.相关资源一直很难找到,经常都是太旧导致API版本都更新换代了,没办法让新人或者外行[比如我]快速验证代码是否可行.在参考多个博客,前人的代码东拼西凑总算是写出了这个H264解码器.算是尽我一点点的绵薄之力对这个社区进行回馈吧.
项目地址:
https://github.com/hirorogithub/ffmpeg_sample-H264_to_cv-Mat
环境依赖:
ffmpeg 3.3
opencv3.20(其实2.4应该也没啥问题)
文件简单介绍:
- H264Decoder.h H264Decoder.cpp:解码器本体,输入H264帧,(以0001开头),输出cv::Mat(如果遇到sps,pps则解码失败,当然第一次遇到的时候ffmpeg会记录下sps,pps的信息用于后面解码)
- H264Decoder_jni.cpp H264Decoder.java JNI文件以及对应java class 注意我在jni层返回的数组中拼凑了图片的长宽信息进去(2*sizeof(int)),所以获得这个数组时需要做相应的解析.由于这边的需求是java负责转发数据,实际跑cv算法还是在C++,所以有这么一个操作,不需要的可以自行处理掉
一些坑:
ffmpeg自己有个time.h,编译时加入头文件依赖什么的,很容易报错找不到time相关的基本类型,解决方法百度有.
一些完善:
我会考虑制作一点H264裸流的样例数据并且写个简单的调用example以供参考.
时间2017-07-18:已经upload了sample调用以及测试数据帧,没记错的话0号文件是H264裸流的整合文件,一个文件里面有很多帧.1号往后的文件是以0001作为分割的H264单帧文件,帧文件都打包上git了