android 捕获视频帧
我需要获取视频文件的帧(它可能位于 SD 卡、缓存目录或应用程序目录上)。我的应用程序中有 android.media 包,里面有 MediaMetadataRetriever 类。为了将第一帧放入位图中,我使用代码:
public static Bitmap getVideoFrame(Context context, Uri videoUri) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
retriever.setDataSource(context, videoUri);
return retriever.captureFrame();
} catch (IllegalArgumentException ex) {
throw new RuntimeException();
} catch (RuntimeException ex) {
throw new RuntimeException();
} finally {
retriever.release();
}
}
但这不起作用。当我设置数据源时,它抛出异常(java.lang.RuntimeException:setDataSource失败:status = 0x80000000)。你知道如何使这段代码工作吗?或者您是否有任何类似(简单)的解决方案而不使用 ffmpeg 或其他外部库? videoUri 是一个有效的 uri(媒体播放器可以播放该 URI 中的视频)
I need to get a frame of a video file (it may be on sdcard, cache dir or app dir). I have package android.media in my application and inside I have class MediaMetadataRetriever. To get first frame into a bitmap, I use code:
public static Bitmap getVideoFrame(Context context, Uri videoUri) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY);
retriever.setDataSource(context, videoUri);
return retriever.captureFrame();
} catch (IllegalArgumentException ex) {
throw new RuntimeException();
} catch (RuntimeException ex) {
throw new RuntimeException();
} finally {
retriever.release();
}
}
But this it's not working. It throws an exception (java.lang.RuntimeException: setDataSource failed: status = 0x80000000) when I set data source. Do you know how to make this code to work? Or Do you have any similar (simple) solution without using ffmpeg or other external libraries? videoUri is a valid uri (media player can play video from that URI)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
以下对我有用:
如果您使用路径而不是文件描述符,也适用。
The following works for me:
Also works if you use a path instead of a filedescriptor.
试试这个,我已经使用过它并且它的工作原理
您可以直接传递您的 url 来代替 uri 。
Try this, I've used it and its working
In place of uri you can directly pass your url .
我使用了这段代码,这对我有用。你可以试试这个。
I used this code and that is working for me. you can try this one.
我的申请也有同样的错误。我在这个网站上看到
http://osdir.com/ml/AndroidDevelopers/2009-06/msg02442.html
我已将手机更新为 GingerBread,但它不再工作了。
I have the same mistake on my application. I saw on this site that
http://osdir.com/ml/AndroidDevelopers/2009-06/msg02442.html
I have updated my phone to GingerBread and it doesn't work anymore.
Uri 不是很具体。有时它们指的是捆绑中的某些东西。它们通常需要转换为绝对路径形式。在您使用 Uri 的另一个实例中,它可能足够智能来检查它是什么类型的 Uri。您所展示的这个案例似乎看起来并不难。
Uri's are not very specific. Sometimes they refer to something in a bundle. They often need to be translated to an absolute path form. The other instance in which you used the Uri, it probably was smart enough to check what kind of Uri it was. This case that you have shown appears to be not looking very hard.
我使用 ThumbnailUtils 类 http: //developer.android.com/reference/android/media/ThumbnailUtils.html
它在底层使用 MediaMetadataRetriever ,大多数时候你可以使用此方法向它发送文件路径,没有任何问题:
但是,在 Android 4.0.4 上,我不断收到 @gabi 所看到的相同错误。使用文件描述符解决了问题,并且仍然适用于非 4.0.4 设备。实际上我最终对 ThumbnailUtils 进行了子类化。这是我的子类方法:
I was getting the same error using the ThumbnailUtils class http://developer.android.com/reference/android/media/ThumbnailUtils.html
It uses MediaMetadataRetriever under the hood and most of the time you can send it a filepath using this method with no problem:
However, on Android 4.0.4, I kept getting the same error @gabi was seeing. Using a file descriptor instead solved the problem and still works for non-4.0.4 devices. I actually ended up subclassing ThumbnailUtils. Here is my subclass method:
当
File
不存在时也会引发异常。因此,在调用setDataSource()
之前,最好检查一下new File(url).exists()
是否存在。The exception is thrown also when the
File
doesn't exist. So before callingsetDataSource()
you'd better check ifnew File(url).exists()
.那么有没有一种特定的方法可以从视频中获取帧
so is there a specific way to get the frame from video as