android - How to correctly receive camera images from onImageAvailable? -


i trying achieve video streaming 1 android device another. in order want obtain frames camera, send them through sockets , show on imageview on phone. problem have use imagereader specific format - yuv_420_888. when try create bitmap based on bytes image can alpha_8(other formats cause exceptions saying buffer not big enough pixels), black , white + wrongly oriented. know if there way obtain correct version directly or somehow convert can make proper bitmap ready show on imageview. here's code:

public class mainactivity extends appcompatactivity {   private imagereader mimagereader;      @override     protected void oncreate(bundle savedinstancestate)     {         super.oncreate(savedinstancestate);         setcontentview(r.layout.activity_main);          this.imageview = (imageview) findviewbyid(r.id.image);          this.handler = new handler(){             @override             public void handlemessage(message msg)             {                 if(msg.what == worker.processed_image)                 {                     imageview.setimagebitmap((bitmap) msg.obj);                 }             }         };     }      private void opencamera()     {         cameramanager manager = (cameramanager) getsystemservice(context.camera_service);          try         {             string cameraid = manager.getcameraidlist()[0];             cameracharacteristics characteristics = manager.getcameracharacteristics(cameraid);             streamconfigurationmap map = characteristics.get(cameracharacteristics.scaler_stream_configuration_map);             mpreviewsize = map.getoutputsizes(surfacetexture.class)[0];             mimagereader = imagereader.newinstance(mpreviewsize.getwidth(), mpreviewsize.getheight(), imageformat.yuv_420_888, 50);             mimagereader.setonimageavailablelistener(new worker(this, this.handler, mpreviewsize.getwidth(), mpreviewsize.getheight()), new handler());              manager.opencamera(cameraid, mstatecallback, null);         }         catch(cameraaccessexception e)         {             e.printstacktrace();         }      }  }   public class worker implements imagereader.onimageavailablelistener {     @override     public void onimageavailable(imagereader imagereader)     {         image image = imagereader.acquirelatestimage();          image.plane plane = image.getplanes()[0];         bytebuffer buffer = plane.getbuffer();         bitmap bm = bitmap.createbitmap(width, heigth, bitmap.config.alpha_8);         bm.copypixelsfrombuffer(buffer);         image.close();         handler.obtainmessage(processed_image, bm).sendtotarget();  } 

almost correct, try use code instead:

@override public void onimageavailable(imagereader reader) {     image image = null;     try {         image = reader.acquirelatestimage(); //        log.d(tag, string.format(locale.getdefault(), "image w = %d; h = %d", image.getwidth(), image.getheight()));         image.plane[] planes = image.getplanes();         bytebuffer buffer = planes[0].getbuffer();         buffer.rewind();         byte[] data = new byte[buffer.capacity()];         buffer.get(data);         bitmap bitmap = bitmapfactory.decodebytearray(data, 0, data.length); //use bitmap     } catch (exception e) {         e.printstacktrace();     }     if (image != null) {         image.close();     } } 

Comments