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



还有一个问题要问你:)

基本上我做了一个实时流媒体服务,发送多个jpeg到我的android应用程序,解码他们一旦他收到。

// 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被完美地实时解码后,应用程序冻结了400毫秒左右,然后它继续解码其他10/20个jpeg,然后再次冻结…

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

你有什么办法可以得到一个流畅的视频,避免死机吗?谢谢!

现在,您使用的是decodeByteArray()的三个参数版本。相反,切换到四个参数的版本,传递一个BitmapFactory.Options作为最后一个值。在这里,将inBitmap设置为可重用的Bitmap对象。

这需要您维护一个小的Bitmap对象池。它可以像两个Bitmap实例一样简单:一个是当前正在显示的,另一个是您正在为视频的下一"帧"做准备的。

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

最新更新