2013-10-09 83 views
1

我尝试使用MediaMetadataRetriever类来获得从视频缩略图得到帧:不从视频的Android 3.2.1使用MediaMetadataRetriever

MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
     try { 
      retriever.setDataSource("/mnt/sdcard/test.ts"); 

      Bitmap thumbnail = retriever.getFrameAtTime(); 
      ivThumbnail.setImageBitmap(thumbnail); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

但我得到在我的日志:

E/MediaMetadataRetrieverJNI﹕ getFrameAtTime: videoFrame is a NULL pointer 

但文档(http://developer.android.com/guide/appendix/media-formats.html)表示,此格式支持Android 3.0+

现在,此代码适用于.mp4文件。有什么建议么?

回答

2

这可能有助于
获得视频URI,并调用此方法..

public void setVideoThumbnail(Uri uri) { 
    String[] projection = { BaseColumns._ID, MediaColumns.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    cursor.moveToFirst(); 
    int columnIndex = cursor.getColumnIndexOrThrow(BaseColumns._ID); 
    int id = cursor.getInt(columnIndex); 

    ContentResolver crThumb = getContentResolver(); 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = 1; 
    Bitmap thumbnail= MediaStore.Video.Thumbnails.getThumbnail(crThumb, id, 
      MediaStore.Video.Thumbnails.MICRO_KIND, options); 
    ivThumbnail.setScaleType(ScaleType.CENTER_CROP); 
    ivThumbnail.setImageBitmap(thumbnail); 
} 
+0

它与空指针坠毁。 – Sinigami

+0

你从哪里得到空指针? – Rahul

+0

当获取游标时,cusror == null – Sinigami

1

尝试this external library提取视频的帧。它适用于API 7,并且不会比MediaMetadataRetriever类失败多次。它应该是很容易的添加到您的项目......有用

+0

谢谢你的回答!今天我会尝试一下,然后我会通知你。 – Sinigami

+0

我试过这个库,但没有结果。可能是这个库不支持.ts格式 – Sinigami

+0

我的代码:FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever(); mmr.setDataSource( “/ MNT/SD卡/ testts.ts”); ((ImageView的)findViewById(R.id.iv))setImageBitmap(mmr.getFrameAtTime()); MMR。发布(); – Sinigami

0

希望it's我有同样的错误。

检查您是否可以通过ExtractMetadata从视频中提取元数据信息。如果不是,则可能是setDataSource()呼叫有问题,或者视频格式错误/编解码器错误。

此代码适用于我。

AssetFileDescriptor afd=getAssets().openFd("t.mp4"); 
mediaMetadataRetriever.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 

我不得不提供afd.getStartOffset()afd.getLength()

也许它可以帮助你在正确的轨道上。

相关问题