Trong ứng dụng của tôi, chúng tôi cần hiển thị khung Video nhận được từ máy chủ đến ứng dụng Android của chúng tôi,
Máy chủ đang gửi dữ liệu video @ 50 khung hình/giây, đã mã hóa trong WebM, sử dụng libvpx để mã hóa và giải mã những hình ảnh,Hiển thị ảnh YUV trong Android
Bây giờ sau khi giải mã từ libvpx dữ liệu YUV nhận được nó, chúng tôi có thể hiển thị trên cách bố trí hình ảnh,
việc thực hiện hiện nay là một cái gì đó như thế này,
Trong JNI/Native C++, chúng tôi đang chuyển đổi dữ liệu YUV thành Dữ liệu RGB Trong khuôn khổ Android, gọi
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;
}
Để tạo hình ảnh bitmap,
để hiển thị hình ảnh trên IMAGExem sử dụng đoạn mã sau,
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");
}
truy vấn của tôi là, tổng thể chức năng này đang xấp xỉ 40 ms, có cách nào để tối ưu hóa nó,
1 - Có cách nào để hiển thị dữ liệu YUV cho imageView không?
2 - Có cách nào khác để tạo ra hình ảnh (hình ảnh Bitmap) từ dữ liệu RGB,
3 - Tôi tin rằng tôi luôn luôn tạo ra hình ảnh, nhưng tôi nghĩ tôi nên tạo bitmap chỉ một lần và làm/cung cấp bộ đệm mới luôn, như và khi chúng tôi nhận được.
vui lòng chia sẻ quan điểm của bạn.
'bitmap.copyPixelsFromBuffer (ByteBuffer.wrap (bits));' chuyển đổi từ YUV sang RGB? Hay bạn đang nói đó là những gì bạn đang làm trong bản địa? – weston
Đây là một cách để làm điều đó. Hãy xem http://stackoverflow.com/questions/9192982/displaying-yuv-image-in-android – bob