我正在创建一个需要显示一系列Bitmap
个视频帧的应用。该应用使用MediaCodec
将视频解码为多个帧,并获得每帧的Bitmap
秒以在ImageView
上显示。
问题是每个Bitmap
的大小约为2~3MB(帧大小为1280 x 720 ,大小为720p视频。)因此当Bitmap的数量超过60~65,应用程序因内存不足而崩溃。为了避免这个问题,我一直在实现D tour算法,该算法只加载需要立即或很快显示的Bitmap
个。基本上我一直在尝试这些方法。
Bitmap
。它的速度足以满足我的需求,但正如所提到的,当Bitmap
的数量超过60~65时,应用程序崩溃。
JPEG
文件中,并在需要时将特定JPEG
加载到Bitmap
。我使用BitmapFactory.decodeFile
从Bitmap
加载JPEG
,但速度很慢。
MJPEG
文件中并加载特定的#34;帧" (在技术上,字节数组)在需要时进入Bitmap
。我想如果从字节数组本身加载Bitmap
,性能可能会更好。因此,在提取帧时,我创建了另一个元数据文件,其中包含每个帧的字节索引的信息,并在需要时使用该信息加载Bitmap
。使用[BitmapFactory.decodeByteArray
](http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeByteArray(byte[],int,int))。我可以看到速度略有提高,但仍然不足。
在这种情况下,我还可以尝试加强Bitmap
加载?
答案 0 :(得分:3)
对于您的算法,某些库(例如Glide和Picasso)可以为您处理。至于编码/解码速度,JPEG可能是您快速将Bitmap刷新到磁盘的最佳选择,因为文件大小很小,可以由hardware支持。
你可以试试的一些事情
android:largeHeap=true
添加到清单,以便您有内存可以使用如果您愿意,可以手动编译您的jpeg库以满足您的特定需求,但这需要非常重要的工作。这是你现在可以测试的something。
答案 1 :(得分:2)
你有几个选择,你的缓存想法很聪明。在我的脑海中,这里有几件事要尝试: