В моем приложении нам нужно отобразить видеокадр, полученный с сервера на наше приложение для Android,
Сервер отправляет видеоданные с частотой 50 кадров в секунду, закодировав их в WebM, т.е. используя libvpx для кодирования и декодирования изображений,
Теперь после декодирования из libvpx получаемых данных YUV, которые мы можем отобразить поверх макета изображения,
текущая реализация выглядит примерно так:
В JNI / Native C ++код, мы конвертируем данные YUV в данные RGB. В платформе Android вызывается
public Bitmap createImgae(byte[] bits, int width, int height, int scan) {
Bitmap bitmap=null;
System.out.println("video: creating bitmap");
//try{
bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(bits));
//}catch(OutOfMemoryError ex){
//}
System.out.println("video: bitmap created");
return bitmap;
}
, чтобы создать растровое изображение,
, чтобы отобразить изображение поверх imageView, используя следующий код,
img = createImgae(imgRaw, imgInfo[0], imgInfo[1], 1);
if(img!=null && !img.isRecycled()){
iv.setImageBitmap(img);
//img.recycle();
img=null;
System.out.println("video: image displayed");
}
Мой запрос в целом занимает около 40 мс, есть ли способ оптимизировать его,
1 - Есть ли способ отобразить данные YUV в imageView?
2 - Есть ли другой способ создать изображение (растровое изображение) из данных RGB,
3 - я считаю, что я всегда создаю изображение, но я полагаю, что я должен создавать только растровое изображениеодин раз и делайте / поставляйте новый буфер всегда, как и когда мы получили.
Пожалуйста, поделитесь своими взглядами.