美好的一天,
我正在开发一个在编辑视频中连接的简单应用程序。
我需要的是获取视频的所有帧(就我所知,帧可以被视为位图)
得到它们之后,我需要编辑帧(位图) 然后将其显示在图像视图中(尽管我要做的是,将所有图像循环,就像它们是视频一样。
我尝试使用
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。
到目前为止,我真的很难过。
请帮助我或指导我走正确的道路。
感谢很多:)
答案 0 :(得分:1)
注意MediaMetadataRetriever.getFrameAtTime方法使用表示时间偏移值的参数,以微秒为单位(1/1000000th of 1/1),而不是以毫秒为单位(1/1000)。
这可能至少解决了使用MediaMetadataRetriever捕获帧时遇到的问题。
无论如何,检查一些替代方案(如JavaCV可能会很有趣,它代表OpenCV,FFmpeg和其他一些流行的图像和视频处理库的包装器。 Windows,Linux,Mac OS和Android支持JavaCV。
JavaCV肯定缺乏更好的文档,但在他们的主页上有一些例子可能是一个很好的起点。 可以在Scala编写的Cookbook Examples中找到更高级的示例。通过对该语言的一些基本理解,即使对于纯Java开发人员来说,它也可能是宝贵的资
答案 1 :(得分:1)
尝试使用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();