opencv 提取视频信息(提取每帧 VS 按照时间提取)

opencv在开发win32平台开发视频应用时,可以用cvCaptureFromAVI方便提取中视频的信息

但是在Android中虽然有这个函数,但是用不了,根本不能用,google了好久才在opencv官网论坛发现是opencv本身对android支持不好的缘故

但是我又需要提取出每一帧的信息来计算待检测物体的移动速度

android SDK自带的MediaMetadataRetriever虽然可以用,但是只能按照时间提取出对应的帧,


有人也遇到类似的问题:https://stackoverflow.com/questions/24199291/process-video-frame-by-frame-in-opencv-on-android

网上也有说用FFpeg来提取每帧,但是被配置过程吓到了。。。网上也流传很复杂

也有说用JavaCV(好像是集成了FFpeg)做的(http://blog.csdn.net/u011270282/article/details/50389012),新建个工程测试了下(http://blog.csdn.net/zgljl2012/article/details/48193859)OK,但是再在opencv环境里面再加JavaCV就蛋疼了,每次编译都会自动把libs下JavaCV添加内的so文件自动删除(与opencv配置的mk文件有关),虽然能搜到一些不删除JavaCV的so文件的解决方案,但是最终没能如愿


转念一想,提取出每帧,不还是要根据帧率换算成时间,再计算速度吗?为什么不安固定时间间隔提取呢?这样的话MediaMetadataRetriever就完全OK了

至此,可以提取视频帧处理了

但是又遇到问题,同样一个MP4文件,用movie maker截取一段后(120k)可以用MediaMetadataRetriever处理,原始的视频(6M)却报null pointer exception,也许是视频大小的问题,也许是movie maker处理后视频某些参数发生变化的原因,总之是实用性不强的原因

查了下确实,所以GitHub才有FFmpegMediaMetadataRetriever的出现,但是官网上的配置写的比较模糊,一些博客上说只要加压把so文件添加libs就ok,而下载地址给的是老版本的下载(新版本好像不直接给libs了),链接失效了,无奈,只好从GitHub中的branch中找提交历史(https://www.zhihu.com/question/20080881),最后尼玛终于可以读取了


http://answers.opencv.org/question/19593/how-to-record-video-from-videocamera-in-android/

http://answers.opencv.org/question/34504/video-processing-in-android/

https://stackoverflow.com/questions/3688993/encode-a-series-of-images-into-a-video



_______________________________________________________________________________________________________________

之前so动态库被删除的问题在这里得到解答:

http://bbs.csdn.net/topics/390397961?page=1#post-395668767

http://blog.csdn.net/zhandoushi1982/article/details/5316669

了解一下mk文件的原理就好了,但是也不太想对JavaCV的每个文件在mk文件中写一遍。。。。



用FFmpegMediaMetadataRetriever现在也出现个问题,大的视频可以提取图片了,小的视频有不可以了,提取出来的duration是0;在Github的issue有人提了类似的问题,貌似还没有fix??

Anyway,我就多加层判断嘛!如果FFmpegMediaMetadataRetriever不能就交给MediaMetadataRetriever

你可能感兴趣的:(opencv)