Android:循环解码JPG:随机冻结

时间:2014-03-27 13:08:08

标签: android multithreading jpeg freeze decoding

以下是您的另一个问题:)

基本上我做了一个实时流媒体服务,向我的Android应用程序发送多个jpeg,一旦收到它们就会对它们进行解码。

// dIn is DataInputStream
// videoFeed is an ImageView
// bitmap is Bitmap
// hand is an Handler of the main thread

//CODE EXECUTED IN ANOTHER THERAD
byte[] inBuff = new byte[8];
byte[] imgBuff;
String inMsg;
while(socket.isConnected()) {
    dIn.readFully(inBuff);
    inMsg = new String(inBuff, "ASCII").trim();
    int size = Integer.parseInt(inMsg);
    imgBuff = new byte[size];
    dIn.readFully(imgBuff);
    out.write("SEND-NEXT-JPEG".getBytes("ASCII"));
    bitmap = BitmapFactory.decodeByteArray(imgBuff, 0, size);   
    hand.post(setImage);
    }
}

private Runnable setImage = new Runnable() {
    @Override
    public void run() {
        videoFeed.setImageBitmap(bitmap);
    }
};

问题是,在大约10或20个jpeg实时完美解码后,应用程序会冻结400ms左右,然后在另一个冻结之前继续解码其他10/20 jpeg ...

我知道发送多个jpeg并不是流媒体视频的好方法,但我只能更改客户端(Android应用),而不是服务器。

你有什么想法获得流畅的视频并避免冻结吗?谢谢!

1 个答案:

答案 0 :(得分:0)

目前,您正在使用decodeByteArray()的三参数版本。相反,切换到四参数版本,传递BitmapFactory.Options作为最后一个值。在那里,set inBitmap是一个可以重复使用的Bitmap对象。

这要求您维护一个小的Bitmap对象池。它可以像两个Bitmap实例一样简单:当前正在显示的实例和您正准备用于下一个"框架的实例#34;视频。

问题在于,对于API等级18及以下,Bitmap需要具有相同的分辨率(高度和宽度,以像素为单位)。在你的情况下,这可能不是问题,因为我认为你的每个位图具有相同的分辨率。