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
Post a Comment