关于ZAKER 融媒体解决方案 合作 加入

MediaMetadataRetrieverJNI ( 14060 ) :getFrameAtTime:vid.

CocoaChina 10-22

我正在使用 MediaMetadataRetriever 通过视频帧创建缩略图 , 但在 Logcat 中收到此消息:

E/MediaMetadataRetrieverJNI ( 14060 ) : getFrameAtTime: videoFrame is a NULL pointer

这是我的代码:

MediaMetadataRetriever retriever = new MediaMetadataRetriever ( ) ; try { Uri videoURI = Uri.parse ( "android.resource://"+getPackageName ( ) +"/"+R.raw.video_one ) ; retriever = new MediaMetadataRetriever ( ) ; retriever.setDataSource ( mContext, videoURI ) ; Bitmap bitmap = retriever.getFrameAtTime ( 100000,MediaMetadataRetriever.OPTION_CLOSEST_SYNC ) ; Drawable drawable = new BitmapDrawable ( getResources ( ) , bitmap ) ; holder.imageView.setImageDrawable ( drawable ) ; holder.progressBar.setVisibility ( View.INVISIBLE ) ; } catch ( Exception e ) { e.printStackTrace ( ) ; }

然后我尝试了这个FFmpegMediaMetadataRetriever Library, 但是它在 Logcat 中产生了这个:

01-19 12:38:33.371: D/dalvikvm ( 20821 ) : Trying to load lib /data/data/wseemann.media.demo/lib/libavutil.so 0x41733c9001-19 12:38:33.371: D/dalvikvm ( 20821 ) : Added shared lib /data/data/wseemann.media.demo/lib/libavutil.so 0x41733c9001-19 12:38:34.121: W/System.err ( 20821 ) : java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFFF01-19 12:38:34.121: W/System.err ( 20821 ) : at wseemann.media.FFmpegMediaMetadataRetriever.setDataSource ( Native Method ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at wseemann.media.FFmpegMediaMetadataRetriever.setDataSource ( FFmpegMediaMetadataRetriever.java:243 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at wseemann.media.demo.FMMRDemo.onCreate ( FMMRDemo.java:50 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at android.app.Activity.performCreate ( Activity.java:5188 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at android.app.Instrumentation.callActivityOnCreate ( Instrumentation.java:1094 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at android.app.ActivityThread.performLaunchActivity ( ActivityThread.java:2074 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at android.app.ActivityThread.handleLaunchActivity ( ActivityThread.java:2135 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at android.app.ActivityThread.access$700 ( ActivityThread.java:140 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at android.app.ActivityThread$H.handleMessage ( ActivityThread.java:1237 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at android.os.Handler.dispatchMessage ( Handler.java:99 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at android.os.Looper.loop ( Looper.java:137 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at android.app.ActivityThread.main ( ActivityThread.java:4921 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at java.lang.reflect.Method.invokeNative ( Native Method ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at java.lang.reflect.Method.invoke ( Method.java:511 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run ( ZygoteInit.java:1038 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at com.android.internal.os.ZygoteInit.main ( ZygoteInit.java:805 ) 01-19 12:38:34.121: W/System.err ( 20821 ) : at dalvik.system.NativeStart.main ( Native Method )

这是我的代码:

ImageView imageView= ( ImageView ) findViewById ( R.id.imageView1 ) ; try { FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever ( ) ; AssetFileDescriptor afd; afd = getAssets ( ) .openFd ( "video_one.mp4" ) ; retriever.setDataSource ( afd.getFileDescriptor ( ) ,afd.getStartOffset ( ) ,afd.getLength ( ) ) ; Bitmap bitmap = retriever.getFrameAtTime ( 100000,FFmpegMediaMetadataRetriever.OPTION_CLOSEST_SYNC ) ; Drawable drawable = new BitmapDrawable ( getResources ( ) , bitmap ) ; imageView.setImageDrawable ( drawable ) ; retriever.release ( ) ; } catch ( Exception e ) { e.printStackTrace ( ) ; }

接下来 , 我尝试使用 SDcard 路径 , 但仍然使用相同的 logcat

最佳答案

尝试使用 MediaMetadataRetriever.OPTION_CLOSEST_SYNC 而不是 MediaMetadataRetriever.OPTION_NEXT_SYNC.

如果这不起作用 , 则应尝试使用FFmpegMediaMetadataRetriever库 , 因为 MediaMetadataRetriever 与所有 API 都不兼容 .

编辑:

对于 SD 卡文件 , 请尝试以下操作:

FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever ( ) ;try {retriever.setDataSource ( "mnt/sdcard/video.mp4" ) ; //file's pathBitmap bitmap = retriever.getFrameAtTime ( 100000,FFmpegMediaMetadataRetriever.OPTION_CLOSEST_SYNC ) ;Drawable drawable = new BitmapDrawable ( getResources ( ) , bitmap ) ;i.setImageDrawable ( drawable ) ;} catch ( Exception e ) {e.printStackTrace ( ) ;}finally{retriever.release ( ) ;}

以上内容由"CocoaChina"上传发布 查看原文

觉得文章不错,微信扫描分享好友

扫码分享