gpt4 book ai didi

android - MediaMetadataRetriever .getFrameAtTime(长,选项)崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:57:30 25 4
gpt4 key购买 nike

我有一个循环,我试图每 1/10 秒从视频中提取一帧。但是在 19 帧(视频的 1.9 秒)之后,我在 Logcat 上收到以下错误:

01-22 11:59:15.498: E/OMXCodec(38): [OMX.google.h264.decoder] Timed out waiting for output buffers: 0/0
01-22 11:59:15.598: E/MetadataRetrieverClient(38): failed to capture a video frame
01-22 11:59:15.598: E/MediaMetadataRetrieverJNI(572): getFrameAtTime: videoFrame is a NULL pointer
01-22 11:59:15.598: D/AndroidRuntime(572): Shutting down VM
01-22 11:59:15.598: W/dalvikvm(572): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
01-22 11:59:15.608: E/AndroidRuntime(572): FATAL EXCEPTION: main
01-22 11:59:15.608: E/AndroidRuntime(572): java.lang.NullPointerException

这是我正在使用的代码:

File videoPath = new File(Environment.getExternalStorageDirectory(), "test.mp4");
String video = videoPath.getAbsolutePath();
MediaMetadataRetriever vidFile = new MediaMetadataRetriever();
vidFile.setDataSource(video);

//Create folder to store images
String storageFolder = "/Storage";
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File newFolder = new File(extStorageDirectory + storageFolder);
newFolder.mkdir();

String value = vidFile.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long vidLength = (Long.parseLong(value)/1000); //Returns milliseconds - divide by 1,000
//Video length = 30037ms - result is 30.037s

for(int i = 0; i <= 10*vidLength; i++, image++) //10*vidLength since I'm getting frames every 1/10th sec
{
Bitmap bmp = vidFile.getFrameAtTime(100000*i, MediaMetadataRetriever.OPTION_CLOSEST);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, bytes);
String imagename = String.format(Locale.ENGLISH, "%03d", image);
File f = new File(Environment.getExternalStorageDirectory() + storageFolder + File.separator + imagename + ".png");
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.close();

//Don't seem to make a difference one way or the other
bytes.flush();
bytes.close();
}

就像我说的,它应该得到大约 300 帧,但在崩溃前只成功提取了 19 帧,但我不明白为什么会出现 NULL 指针错误。

提前致谢

最佳答案

您是否尝试过使用 FFmpegMediaMetadataRetriever lib 而不是 MediaMetadataRetriever?

此外,从您的 logcat 上的这一行:

01-22 11:59:15.598: E/MediaMetadataRetrieverJNI(572): getFrameAtTime: videoFrame is a NULL pointer

我会尝试让它记录 for 循环的每一行,比如 Log.d("MyApp","Param of getFrameAtTime"+(100000*i));

我知道您已经知道问题出在哪个帧 (19/20),但只是想看看该变量在变成空指针之前发生了什么(也许您可以使用 Long i 而不是 int i?)。

此外,您是否尝试过使用 MediaMetadataRetriever.OPTION_CLOSEST_SYNC 而不是 OPTION_CLOSEST 的上述建议?

关于android - MediaMetadataRetriever .getFrameAtTime(长,选项)崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14460151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com