使用 FFmpegMediaMetadataRetriever 以及 MediaMetadataRetriever 获取关键帧失败(返回null)问题

       大家知道 一个较长的视频中可能存在多个关键帧,而往往第一帧是黑色的,因此我们会采用1/4时间点处的关键帧用于生成视频的缩略图。

       但是后来发现某些视频采用 MediaMetadataRetriever 会出现

MediaMetadataRetrieverJNI: getFrameAtTime: videoFrame is a NULL pointer 

     同时使用 FFmpegMediaMetadataRetriever获取1/4处关键帧始终返回 null

   

     后来尝试通过linux中的工具 ffmpeg 来生产 缩略图。终于找到了重要线索,开心~~

     当使用以下命令仍然不能生成缩略图:

ffmpeg -i video.mp4 -y -f image2 -ss 8 -t 0.001 -s 350x240 thumbnail.jpg

 但将命令修改为下面的状态竟然能生成缩略图:

ffmpeg -i video.mp4 -y -f image2  -t 0.001 -s 350x240 thumbnail.jpg

其实这两段命令唯一的差别是 “-ss 8” ,这个属性的意思是生产缩略图的时间点。(其他关于ffmpeg的使用可以参考ffmpeg 常用命令汇总

于是我将之前android 代码中FFmpegMediaMetadataRetriever获取缩略图的结果由

retriever.getScaledFrameAtTime(80, (int) destWidth, destHeight);

改为 

retriever.getScaledFrameAtTime(-1, (int) destWidth, destHeight);

果然能够生产缩略图啦啦,哈哈。

至于MediaMetadataRetriever 的问题仍然存在,这应该确实设个bug。

********************************************************************************************************

但为啥那个视频设置时间点就会失败呢???

后来通过以下命令可以获取视频中所有的缩略图发现:

ffmpeg -i video.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 1920*1080 -f image2 core-%02d.jpeg

那个视频竟然只有一帧关键帧!!!所以如果设置时间点不正确的话,是只能返回null,满脸黑线……

********************************************************************************************************

因此建议在生成缩略图时,如果设置了时间点,返回null;那么再重新创建一个 FFmpegMediaMetadataRetriever ,不设置时间点去获取。

注意:一定要重新去创建一个 FFmpegMediaMetadataRetriever 而不是 在 上一个FFmpegMediaMetadataRetriever 中直接获取,否则仍然获取不到!

一点经验,希望能帮到大家~

猜你喜欢

转载自blog.csdn.net/a953210725/article/details/101752470
今日推荐