为什么getFrameAtIndex比getFrameAtTime()快



我正在尝试从视频中获取所有帧(一个接一个(,现在我使用的是:

int framesCount = videoInformation.getFramesCount();
for (int i = 0; i < framesCount; i++) {
Bitmap currentFrame = mediaMetadataRetriever.getFrameAtIndex(i);

对于5秒视频,提取所有帧(159帧(需要

13秒由于getFrameAtIndex(i)需要API 28,我尝试使用getFrameAtTime()

long timeS = videoInformation.getDuration() / videoInformation.getFps();
int framesCount = videoInformation.getFramesCount();
for (int i = 0; i < framesCount; i++) {
Bitmap currentFrame = (mediaMetadataRetriever.getFrameAtTime(i*timeS*1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC));

对于相同的5秒视频,几乎需要48秒

我不能代表两者的本机实现,因为这两个函数都调用各自的本机函数,但是,如果您查看getFrameAtIndex,您可以看到:

通过读取metadata来访问总framecount,并使用类似于Arraysindex来检索帧。

int frameCount = Integer.parseInt(extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT));

getFrameAtIndex()调用getFramesAtIndexInternal()

private @NonNull List<Bitmap> getFramesAtIndexInternal(
int frameIndex, int numFrames, @Nullable BitmapParams params) {
if (!"yes".equals(extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_VIDEO))) {
throw new IllegalStateException("Does not contain video or image sequences");
}
int frameCount = Integer.parseInt(
extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT));
if (frameIndex < 0 || numFrames < 1
|| frameIndex >= frameCount
|| frameIndex > frameCount - numFrames) {
throw new IllegalArgumentException("Invalid frameIndex or numFrames: "
+ frameIndex + ", " + numFrames);
}
return _getFrameAtIndex(frameIndex, numFrames, params);
}

getFrameAtTime并不是真正基于索引的,而是寻找/搜索,直到它将帧时间戳与您所经过的所需时间相匹配,或者最接近的时间:

public @Nullable Bitmap getFrameAtTime(long timeUs, @Option int option) {
if (option < OPTION_PREVIOUS_SYNC ||
option > OPTION_CLOSEST) {
throw new IllegalArgumentException("Unsupported option: " + option);
}
return _getFrameAtTime(timeUs, option, -1 /*dst_width*/, -1 /*dst_height*/, null);
}

https://github.com/aosp-mirror/platform_frameworks_base/blob/master/media/java/android/media/MediaMetadataRetriever.java

相关内容

  • 没有找到相关文章

最新更新