在我的Android应用中,我收到了专有格式的远程视频流。当一个新的网络数据包到达时,我本地解码它并获得一个位图。在UI中,此位图通过setImageBitmap()
方法显示在ImageView控件中。
我能够每秒处理12到14帧。我想知道是否有一种方法可以在性能方面对其进行优化。也许我可以使用硬件加速。
答案 0 :(得分:1)
为什么不使用已为您做过所有这类事情的VideoView
?
然而:
我认为您应该使用SurfaceView
代替ImageView
。使用SurfaceView
,您拥有自己的专用线程,负责在画布上绘图。因此重绘速度更快。
我猜你是在异步线程中编码一个帧位图,这完全没问题。但你应该考虑如何并行化。基本上使用ThreadPool
或类似的东西将您的视频解码为单个位图。将它们放在Buffer
中,可以是Fifo
,List
或Queue
或其他什么,但请记住,一个线程可能比另一个线程更快,所以你更好为每个解码任务提供一个订单号,以便您可以按正确的顺序将编码的位图添加到Buffer
中。 SurfaceView
next应始终从缓冲区中获取第一个图像并将其显示在屏幕上。
安排SurfaceView
线程重绘为每秒60帧。因此,不要在while-loop
考虑更智能(预定)的解决方案时反复重新绘制。
仅在Buffer
包含足够图像时重绘(您必须自行确定缓冲区中的图像数量或谷歌)。否则显示“加载/缓冲”动画
垃圾收集可能需要一些时间,因此请尽量减少垃圾收集运行的时间。位图关联可能会占用大量内存,因此垃圾收集器需要经常运行才能为下一个位图找到空闲内存。因此,如果您能够以更适合智能手机的宽度/高度(可能是针对不同显示尺寸的不同文件)提供视频源文件,请考虑一下。想想你如何减少内存消耗。 BitmapFactory
中有各种选项可用于减少内存消耗(减少正在运行的垃圾回收),如inSampleSize
或inBitmap
这似乎是一个不错的选择,因为所有位图都应具有相同的宽度/身高。看看here。您还可以使用BitmapConfig.RGB_565
来降低位图质量。