[英]Android: Get all the frames of a video (any video file)
早安,
我正在研究一个连接编辑视频的简单应用程序。
我需要获取视频的所有帧(据我所知,帧可以视为位图)
全部获取后,我需要编辑帧(位图),然后在imageview中显示它(尽管我要做的是,将所有图像像视频一样循环播放。)
我尝试使用
mediaMetadataRetriever.getFrameAtTime(0);
但是问题是,在给定时间内捕获的帧不正确。
样例代码:
bm[1] = mediaMetadataRetriever.getFrameAtTime(0);
bm[2] = mediaMetadataRetriever.getFrameAtTime(50000);
bm[3] = mediaMetadataRetriever.getFrameAtTime(100000);
bm[4] = mediaMetadataRetriever.getFrameAtTime(150000);
bm[5] = mediaMetadataRetriever.getFrameAtTime(200000);
然后在imageview中循环位图。
我听说过ffmpeg,并尝试对其进行研究。
问题是,我正在使用Windows,而不是ubuntu或linux。
到目前为止,我真的很难受。
请帮助我,或直接引导我走正确的道路。
非常感谢 :)
请注意, MediaMetadataRetriever.getFrameAtTime方法使用的参数表示时间偏移值的单位是微秒(每秒的1/1000000),而不是毫秒(1/1000)。
至少可以解决使用MediaMetadataRetriever捕获帧时遇到的问题。
无论如何,您可能会很感兴趣地检查一些替代方案,例如JavaCV ,它代表OpenCV,FFmpeg和一些其他流行的图像和视频处理库的包装。 Windows,Linux,Mac OS和Android支持JavaCV。
JavaCV肯定缺乏更好的文档,但是其主页上有一些示例可能是一个很好的起点。 可以在Scala编写的Cookbook示例中找到更高级的示例。 对这种语言有一些基本的了解,即使对于纯Java开发人员来说,它也可能是宝贵的资源。
尝试使用FFmpeg作为后端的FFmpegMediaMetadataRetriever :
FFmpegMediaMetadataRetriever fmmr = new FFmpegMediaMetadataRetriever();
bm[1] = fmmr.getFrameAtTime(0);
bm[2] = fmmr.getFrameAtTime(50000);
bm[3] = fmmr.getFrameAtTime(100000);
bm[4] = fmmr.getFrameAtTime(150000);
bm[5] = fmmr.getFrameAtTime(200000);
fmmr.release();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.