2015-01-19 3 views
3

Я создаю эскизы по видео кадра с помощью MediaMetadataRetriever, но я получаю это сообщение в Logcat:MediaMetadataRetrieverJNI (14060): getFrameAtTime: VideoFrame является указателем NULL (Android)

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 0x41733c90 
01-19 12:38:33.371: D/dalvikvm(20821): Added shared lib /data/data/wseemann.media.demo/lib/libavutil.so 0x41733c90 
01-19 12:38:34.121: W/System.err(20821): java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFFF 
01-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

ответ

1

Попробуйте использовать MediaMetadataRetriever.OPTION_CLOSEST_SYNC вместо MediaMetadataRetriever.OPTION_NEXT_SYNC.

Если это не сработает, попробуйте использовать библиотеку FFmpegMediaMetadataRetriever, так как MediaMetadataRetriever несовместим со всеми API.

EDIT:

Попробуйте это файлы SD карты:

FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever(); 
try { 
retriever.setDataSource("mnt/sdcard/video.mp4"); //file's path 
Bitmap 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(); 
} 
+0

Я попробовал оба предложения. Первое не сработало, а второе дает исключение: вызвано: java.lang.UnsatisfiedLinkError: Не удалось загрузить avutil: findLibrary возвращается null – User42590

+1

Вы скопировали предварительно созданные библиотеки в 'libs' вашего проекта? папка? – max59

+0

да Я сделал, что содержит armeabi, далее содержит libavcodec и многое другое. Аналогично armeabi-v7a, mips, x86 – User42590

0

По моему опыту, встроенный MediaMetadataRetriver редко работает вообще. Попробуйте что-то like this.

+0

Я попробовал ваше предложение. Но на этой строке FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever(); он дает исключение: вызвано: java.lang.UnsatisfiedLinkError: не удалось загрузить avutil: findLibrary возвращается null – User42590