还有一个问题要问你:)
基本上我做了一个实时流媒体服务,发送多个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
需要具有相同的分辨率(以像素为单位的高度和宽度)。在您的情况下,这可能不是问题,因为我可以想象您的每个位图都具有相同的分辨率。