Android视频流采集手机录像和PC同步.docx
- 文档编号:5901627
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:17
- 大小:27.51KB
Android视频流采集手机录像和PC同步.docx
《Android视频流采集手机录像和PC同步.docx》由会员分享,可在线阅读,更多相关《Android视频流采集手机录像和PC同步.docx(17页珍藏版)》请在冰豆网上搜索。
Android视频流采集手机录像和PC同步
【转自MacroCheng】Android视频流采集——手机录像和PC同步
2011-05-2415:
32
这个完全是站在巨人的肩膀上,网上流传甚广的一个帖子,只是他说他当时调通是基于1.5的系统在G3上调通的,我是在NexusOne上基于2.2的系统调通的。
但是这里所指的调通只是指PC端为Windows的,我用的Ubuntu系统,在Ubuntu下就没有调通,在PC端运行出之后发送数据等等都很正常,但是就是不显示任何图像,很让人郁闷,不知道有没有那位大虾在Linux下调通的,欢迎交流!
下面就贴代码了:
PC端(目前仅Windows下起作用):
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Point;
importjava.awt.Transparency;
importjava.awt.color.ColorSpace;
importjava.awt.image.BufferedImage;
importjava.awt.image.ComponentColorModel;
importjava.awt.image.DataBuffer;
importjava.awt.image.DataBufferByte;
importjava.awt.image.PixelInterleavedSampleModel;
importjava.awt.image.Raster;
importjava.awt.image.SampleModel;
importjava.awt.image.WritableRaster;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
import.ServerSocket;
import.Socket;
publicclassMainextendsFrame{
privatestaticfinallongserialVersionUID=1L;
privateBufferedImageim;
//图像信息
//privatefinalintwidth=480;
//privatefinalintheight=320;
privatestaticfinalintwidth=240;
privatestaticfinalintheight=160;
privatestaticfinalintnumBands=3;
privatestaticfinalintdataLen=57600;//307200OR230400//5760076800
privatestaticfinalinttt=28800;//14400;//28800;
//图像数组
privatebyte[]byteArray=newbyte[width*height*numBands];//图像RGB数组
privatebyte[]yuv420sp=newbyte[dataLen];//图像YUV数组
privatestaticfinalint[]bandOffsets=newint[]{
0,1,2
};
privatestaticfinalSampleModelsampleModel=newPixelInterleavedSampleModel(
DataBuffer.TYPE_BYTE,width,height,3,width*3,bandOffsets);
//ColorModel
privatestaticfinalColorSpacecs=ColorSpace.getInstance(ColorSpace.CS_sRGB);
privatestaticfinalComponentColorModelcm=newComponentColorModel(cs,false,false,
Transparency.OPAQUE,DataBuffer.TYPE_BYTE);
publicMain(){
super("Flushing");
updateIM();
setSize(480,320);
//窗口关闭方法
this.addWindowListener(newjava.awt.event.WindowAdapter(){
publicvoidwindowClosing(java.awt.event.WindowEvente){
System.exit(0);
}
});
//窗口居中
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setVisible(true);
this.getData();
}
publicvoidupdate(Graphicsg){
paint(g);
}
publicvoidpaint(Graphicsg){
g.drawImage(im,0,0,480,320,this);
}
publicvoidgetData(){
try{
System.out.print("等待连接……\n");
ServerSocketserver=newServerSocket(8899);
Socketsocket=server.accept();
System.out.print("已建立连接!
\n");
DataInputStreamdis=newDataInputStream(socket.getInputStream());
DataOutputStreamdos=newDataOutputStream(socket.getOutputStream());
while(true){
for(inti=0;i dis.read(yuv420sp,i*tt,tt); } //得到数据之后立即更新显示 updateIM(); im.flush(); repaint(); dos.writeBoolean(true); } }catch(Exceptionex){ ex.printStackTrace(); } } privatevoidupdateIM(){ try{ //解析YUV成RGB格式 decodeYUV420SP(byteArray,yuv420sp,width,height); DataBufferdataBuffer=newDataBufferByte(byteArray,numBands); WritableRasterwr=Raster.createWritableRaster(sampleModel,dataBuffer, newPoint(0,0)); im=newBufferedImage(cm,wr,false,null); }catch(Exceptionex){ ex.printStackTrace(); } } privatestaticvoiddecodeYUV420SP(byte[]rgbBuf,byte[]yuv420sp,intwidth,intheight){ finalintframeSize=width*height; if(rgbBuf==null) thrownewNullPointerException("buffer'rgbBuf'isnull"); if(rgbBuf.length thrownewIllegalArgumentException("buffer'rgbBuf'size"+rgbBuf.length +" if(yuv420sp==null) thrownewNullPointerException("buffer'yuv420sp'isnull"); if(yuv420sp.length thrownewIllegalArgumentException("buffer'yuv420sp'size"+yuv420sp.length +" inti=0,y=0; intuvp=0,u=0,v=0; inty1192=0,r=0,g=0,b=0; for(intj=0,yp=0;j uvp=frameSize+(j>>1)*width; u=0; v=0; for(i=0;i y=(0xff&((int)yuv420sp[yp]))-16; if(y<0) y=0; if((i&1)==0){ v=(0xff&yuv420sp[uvp++])-128; u=(0xff&yuv420sp[uvp++])-128; } y1192=1192*y; r=(y1192+1634*v); g=(y1192-833*v-400*u); b=(y1192+2066*u); if(r<0) r=0; elseif(r>262143) r=262143; if(g<0) g=0; elseif(g>262143) g=262143; if(b<0) b=0; elseif(b>262143) b=262143; rgbBuf[yp*3]=(byte)(r>>10); rgbBuf[yp*3+1]=(byte)(g>>10); rgbBuf[yp*3+2]=(byte)(b>>10); } } } publicstaticvoidmain(String[]args){ //Framef= newMain(); } } Android端: Java代码: importjava.io.DataInputStream; importjava.io.DataOutputStream; import.Socket; importandroid.app.Activity; importandroid.content.res.Configuration; importandroid.graphics.PixelFormat; importandroid.hardware.Camera; importandroid.os.Bundle; importandroid.view.SurfaceHolder; importandroid.view.SurfaceView; importandroid.view.View; importandroid.view.Window; importandroid.view.WindowManager; importandroid.view.SurfaceHolder.Callback; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.EditText; publicclassMainActivityextendsActivityimplementsCallback,OnClickListener{ privateSurfaceViewmSurfaceView=null; privateSurfaceHoldermSurfaceHolder=null; privateCameramCamera=null; privatebooleanmPreviewRunning=false; //连接相关 privateEditTextremoteIP=null; privateButtonconnect=null; privateStringremoteIPStr=null; //视频数据 privateStreamItstreamIt=null; publicstaticKitkit=null; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); mSurfaceView=(SurfaceView)this.findViewById(R.id.surface_camera); mSurfaceHolder=mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); remoteIP=(EditText)this.findViewById(R.id.remoteIP); connect=(Button)this.findViewById(R.id.connect); connect.setOnClickListener(this); } publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){ if(mPreviewRunning){ mCamera.stopPreview(); } Camera.Parametersp=mCamera.getParameters(); p.setPreviewSize(width,height); streamIt=newStreamIt(); kit=newKit(); mCamera.setPreviewCallback(streamIt); mCamera.setParameters(p); try{ mCamera.setPreviewDisplay(holder); }catch(Exceptionex){ } mCamera.startPreview(); mPreviewRunning=true; } publicvoidsurfaceCreated(SurfaceHolderholder){ mCamera=Camera.open(); } publicvoidsurfaceDestroyed(SurfaceHolderholder){ mCamera.stopPreview(); mPreviewRunning=false; mCamera.release(); } @Override publicvoidonConfigurationChanged(ConfigurationnewConfig){ try{ super.onConfigurationChanged(newConfig); if(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE){ }elseif(this.getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT){ } }catch(Exceptionex){ } } classKitimplementsRunnable{ privatebooleanrun=true; //privatefinalintdataLen=57600;//307200OR23040076800OR57600 privatefinalinttt=28800; publicvoidrun(){ //TODOAuto-generatedmethodstub try{ Socketsocket=newSocket("219.232.191.146",8899); //Socketsocket=newSocket("10.0.2.15",8899); DataOutputStreamdos=newDataOutputStream(socket.getOutputStream()); DataInputStreamdis=newDataInputStream(socket.getInputStream()); while(run){ dos.write(streamIt.yuv420
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 视频 采集 手机 录像 PC 同步