gpt4 book ai didi

android - 使用 AndroidFrameConverter 将 javacv 帧转换为位图

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:44 25 4
gpt4 key购买 nike

我正在尝试使用 javacv AndroidFrameConverter 将大小为 1280x720 的帧转换为位图,但转换需要很长时间。下面是转换的示例代码。

FrameGrabber grabber = new FFmpegFrameGrabber(videoUrl);
frame = grabber.grab();
AndroidFrameConverter converter = new AndroidFrameConverter();
Bitmap originalBitmap = converter.convert(frame);

还有比这更快的解决方案吗?

最佳答案

FrameGrabber.grab() 返回的

Frame 是 javacv 特定的,Bitmap 是 Android 特定的,我怀疑两者之间是否有更快的转换方法两者因为彼此不认识并且都针对自己的使用进行了优化,所以它们无法优化两种数据格式之间的转换过程。

您正在移动 1280 * 720 * 4 字节,大约每帧 3.6 MB,这对于移动设备来说已经很多了,最重要的是考虑到内存分配。

我怀疑您是否会在不将 javacv 换成其他东西的情况下找到另一个转换工具 - 无法想象专门用于将 javacv 的 Frame 转换为 Android Bitmap 以替换的工具内置方法。

此外,AndroidFrameConverter.convert() 已经很聪明了 - 它只在第一次或规范发生变化(如大小等)时创建 Bitmap , 然后只复制字节。

幸运的是,它有能力重用一次创建的 Bitmap 实例,FFmpegFrameGrabber 也有这种能力,所以在第一次运行时,它们将创建每个适当的对象,但是从第二帧应该重用它们拥有的对象——这样至少不会发生不必要的内存分配,这会降低移动设备的性能。这意味着平均转换许多帧应该比只转换一帧快得多 - 只是不要为每个帧创建新的抓取器和转换器实例。

使用 GPU 进行并行化是可能的 - 手动创建一个 Bitmap,分割 Frame 的缓冲区并并行设置 Bitmap 的像素。我自己从来没有做过这样的事情,所以真的不能发表更多评论。请记住,并行算法有其自身的开销,并不总是比顺序算法更快。而且我不确定 GPU 编程的可移植性如何。使用 CPU 进行并行化不值得尝试——当前设备有多少个内核? 4?开销应该大于 yield 。

关于android - 使用 AndroidFrameConverter 将 javacv 帧转换为位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37827121/

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