版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【转自MacroChengAndroid视频流采集手机录像和PC同步2011-05-2415:32这个完全是站在巨人的肩膀上,网上流传甚广的一个帖子,只是他说他当时调通是基于1.5的系统在G3上调通的,我是在NexusOne上基于2.2的系统调通的。但是这里所指的调通只是指PC端为Windows的,我用的Ubuntu系统,在Ubuntu下就没有调通,在PC端运行出之后发送数据等等都很正常,但是就是不显示任何图像,很让人郁闷,不知道有没有那位大虾在Linux下调通的,欢迎交流!下面就贴代码了:PC端(目前仅Windows下起作用):importjava.awt.Frame;importjava.
2、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.aw
3、t.image.Raster;importjava.awt.image.SampleModel;importjava.awt.image.WritableRaster;importjava.io.DataInputStream;importjava.io.DataOutputStream;.ServerSocket;.Socket;publicclassMainextendsFrameprivatestaticfinallongserialVersionUID=1L;privateBufferedImageim;/图像信息/privatefinalintwidth=480;/privatefi
4、nalintheight=320;privatestaticfinalintwidth=240;privatestaticfinalintheight=160;privatestaticfinalintnumBands=3;privatestaticfinalintdataLen=57600;/307200OR230400/5760076800privatestaticfinalinttt=28800;/14400;/28800;/图像数组privatebytebyteArray=newbytewidth*height*numBands;/图像RGB数组privatebyteyuv420sp=
5、newbytedataLen;/图像YUV组privatestaticfinalintbandOffsets=newint0,1,2;privatestaticfinalSampleModelsampleModel=newPixelInterleavedSampleModel(DataBuffer.TYPE_BYTE,width,height,3,width*3,bandOffsets);/ColorModelprivatestaticfinalColorSpacecs=ColorSpace.getInstance(ColorSpace.CS_sRGB);privatestaticfinalC
6、omponentColorModelcm=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);)
7、;/窗口居中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()trySystem.out.print("等待连接n");ServerSocketserver=newServerSocket(8899);Sock
8、etsocket=server.accept();System.out.print("已建立连接!n");DataInputStreamdis=newDataInputStream(socket.getInputStream();DataOutputStreamdos=newDataOutputStream(socket.getOutputStream();while(true)for(inti=0;i<dataLen/tt;i+)dis.read(yuv420sp,i*tt,tt);)/得到数据之后立即更新显示updateIM();im.flush();repain
9、t();dos.writeBoolean(true);)catch(Exceptionex)ex.printStackTrace();privatevoidupdateIM()try/解析YUV成RG璐式decodeYUV420SP(byteArray,yuv420sp,width,height);DataBufferdataBuffer=newDataBufferByte(byteArray,numBands);WritableRasterwr=Raster.createWritableRaster(sampleModel,dataBuffer,newPoint(0,0);im=newBuf
10、feredImage(cm,wr,false,null);catch(Exceptionex)ex.printStackTrace();width,privatestaticvoiddecodeYUV420SP(bytergbBuf,byteyuv420sp,intintheight)finalintframeSize=width*height;if(rgbBuf=null)thrownewNullPointerException("buffer'rgbBufisnull");if(rgbBuf.length<frameSize*3)thrownewIlleg
11、alArgumentException("buffer'rgbBufsize"+rgbBuf.length+"<minimum"+frameSize*3);if(yuv420sp=null)thrownewNullPointerException("buffer'yuv420sp'isnull");if(yuv420sp.length<frameSize*3/2)thrownewIllegalArgumentException("buffer'yuv420sp'size&q
12、uot;+yuv420sp.length+"<minimum"+frameSize*3/2);inti=0,y=0;intuvp=0,u=0,v=0;inty1192=0,r=0,g=0,b=0;for(intj=0,yp=0;j<height;j+)uvp=frameSize+(j>>1)*width;u=0;v=0;for(i=0;i<width;i+,yp+)y=(0xff&(int)yuv420spyp)-16;if(y<0)y=0;if(i&1)=0)v=(0xff&yuv420spuvp+)-128;u
13、=(0xff&yuv420spuvp+)-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<o)g=0;elseif(g>262143)g=262143;if(b<0)b=0;elseif(b>262143)b=262143;rgbBufyp*3=(byte)(r>>10);rgbBufyp*3+1=(byte)(g>>10);rgbBufyp*3+
14、2=(byte)(b>>10);)publicstaticvoidmain(Stringargs)/Framef=newMain();)Android端:Java代码:importjava.io.DatalnputStream;importjava.io.DataOutputStream;.Socket;importandroid.app.Activity;importandroid.content.res.Configuration;importandroid.graphics.PixelFormat;importandroid.hardware.Camera;importand
15、roid.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.EditTex
16、t;publicclassMainActivityextendsActivityimplementsCallback,OnClickListenerprivateSurfaceViewmSurfaceView=null;privateSurfaceHoldermSurfaceHolder=null;privateCameramCamera=null;privatebooleanmPreviewRunning=false;/连接相关privateEditTextremoteIP=null;privateButtonconnect=null;privateStringremoteIPStr=nul
17、l;/视频数据privateStreamItstreamIt=null;publicstaticKitkit=null;OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);getWindow().setFormat(PixelFormat.TRANSLUCENT);requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCR
18、EEN,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)t
19、his.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
20、);streamIt=newStreamIt();kit=newKit();mCamera.setPreviewCallback(streamIt);mCamera.setParameters(p);trymCamera.setPreviewDisplay(holder);catch(Exceptionex)mCamera.startPreview();mPreviewRunning=true;publicvoidsurfaceCreated(SurfaceHolderholder)mCamera=Camera.open();publicvoidsurfaceDestroyed(Surface
21、Holderholder)mCamera.stopPreview();mPreviewRunning=false;mCamera.release();OverridepublicvoidonConfigurationChanged(ConfigurationnewConfig)trysuper.onConfigurationChanged(newConfig);if(this.getResources().getConfiguration().orientation=Configuration.ORIENTATION_LANDSCAPE)elseif(this.getResources().g
22、etConfiguration().orientation=Configuration.ORIENTATION_PORTRAIT)catch(Exceptionex)classKitimplementsRunnableprivatebooleanrun=true;/privatefinalintdataLen=57600;Z/307200OR23040076800OR57600privatefinalinttt=28800;publicvoidrun()/TODOAuto-generatedmethodstubtrySocketsocket=newSocket("219.232.19
23、1.146",8899);/Socketsocket=newSocket("5",8899);DataOutputStreamdos=newDataOutputStream(socket.getOutputStream();DataInputStreamdis=newDataInputStream(socket.getInputStream();while(run)dos.write(streamIt.yuv420sp,0,28800);dos.write(streamIt.yuv420sp,28800,28800);dis.readBoolean
24、();Thread.sleep(155);)catch(Exceptionex)run=false;ex.printStackTrace();OverridepublicvoidonClick(Viewview)/TODOAuto-generatedmethodstubif(view=connect)/连接函数/remoteIPStr=remoteIP.getText().toString();newThread(MainActivity.kit).start();classStreamItimplementsCamera.PreviewCallbackpublicbyteyuv420sp=n
25、ull;privatebooleant=true;publicvoidonPreviewFrame(bytedata,Cameracamera)/TODOAuto-generatedmethodstub/if(t)/t=false;/newThread(AndroidVideo.kit).start();/yuv420sp=data;布局文件:<SurfaceViewandroid:id="+id/surface_camera"android:layout_width="240px"android:layout_height="160px
26、”></SurfaceView>还要记得在AndroidManifest.xml中添加如下的权限声明:<uses-permissionandroid:name="android.permission.CAMERA"/><uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>这样就可以
27、跑通了,效果还是很不错的,我用的WIFI,所有绿屏的现象还是比较少的,比较流畅。遗憾的是Ubuntu下没能调通。还需要努力阿!三步实现捕捉android手机摄像头视频流来源:赖智超的日志1 .创建Camera对象:varcamera:Camera=Camera.getCamera();获取Camera对象的实例。如果摄像头可用,返回一个Camera的对象,否则返回空。if(camera=null)trace"Nocameraisnotsupported!");)else(trace("CameraisOK");camera.setMode(800,400
28、,15,true);/设置视频分辨率和帧频)2 .设置使用Android摄像头设备的权限<manifestAdditions><!CDATA<manifest><uses-permissionandroid:name="android.permission.CAMERA"/></manifest>></manifestAdditions>3 .摄像头附加到视频对象privatefunctionconnectCamera():void(varvideo:Video=newVideo(camera.widt
29、h,camera.height);video.attachCamera(camera);addChild(video);总结android音频视频操作Android播放音乐和视频用的是类:MediaPlayer刻录声音和视频用的是类:MediaRecorder拍照:Camera没什么难度,都是调用android的API1 .刻录视频,关键代码如下:Java代码1. MediaRecordermediaRecorder=newMediaRecorder();2. mediaRecorder.reset();首先重置一下3. mediaRecorder.setVideoSource(MediaRe
30、corder.VideoSource.CAMERA);/从照相机种采集视频4. mediaRecorder.setVideoSource(MediaRecorder.AudioSource.MIC);/从麦克风中采集尸日5. mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);输出格式3GP6. mediaRecorder.setVideoSize(350,240);视频文件大小7. mediaRecorder.setVideoFrameRate(3);录制帧数,每秒3帧8. mediaRecorder.set
31、VideoEncoder(MediaRecorder.VideoEncoder.H263);/设置视频编码方式9. mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);/设置声音编码方式10. /*设置保存路径为sd卡根目录*/11. FilevideoFile=newFile(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");12. mediaRecorder.setOutputFile(vi
32、deoFile.getAbsolutePath();13. mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface();/定义一个SurfaceView来显示画面14. mediaRecorder.prepare();此处要捕捉异常,底层调用硬件实现准备工作15. mediaRecorder.start();16.17. 停止18. mediaRecorder.stop();19. mediaRecorder.release();20. mediaRecorder=null;2 .刻录声音,关键代码如下:Java代码
33、会。1. 与录制视频很相似2. mRecorder=newMediaRecorder();3. mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);/声音来源麦克风4. mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);/输出格式5. mRecorder.setOutputFile(mFileName);/可以自己给定保存文件6. mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);/编码
34、方式7. mRecorder.prepare();8. mRecorder.start();3 .播放声音,关键代码如下:Java代码-,1. MediaPlayermPlayer=newMediaPlayer();2. mPlayer.reset3. mPlayer.setDataSource(mFileName);/设置播放的声音文件4. mPlayer.prepare();5. mPlayer.start();6.7. /8. 基本方法9. mPlayer.pause()暂停播放10. mPlayer.stop()/停止播放11. mPlayer.seekTo(int)直接跳到某点进行播放4 .播放视频,关键代码如下:Java代码1. MeidaPlayermedia=newMeidaPlayer();2. media.setAudioStreamType(AudioManager.STREAM_MUSIC);3. media.setDisplay(sh);/定义一个Surf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年版住宿生权利与义务协议3篇
- 成都艺术职业大学《综合线描》2023-2024学年第一学期期末试卷
- 二零二五年度全球投资借款协议3篇
- 2024年跨国软件许可及服务合同
- 2024年责任分配:安全生产管理合约
- 2025年度新能源汽车生产合作协议范本正规范本
- 绿色循环农业新模式策略及实施路径
- 2024年监理服务居间代理协议格式版B版
- 2021-2026年中国民用机场行业发展监测及投资战略规划研究报告
- 2024年甲乙双方关于二手房买卖的贷款担保合同3篇
- 审计常用法规培训课件
- 健康指南知己知彼了解你的身体质量指数BMI
- 主题二:拥军优属心连心 课件 2023-2024学年广州版初中劳动技术九年级下册
- 海洋技术与海洋装备发展
- 智慧火电厂整体解决方案
- 电厂锅炉炉膛烟道内部作业三措两案
- 收费站(所)事故隐患排查清单
- 驾驶证学法减分(学法免分)题库及答案(200题完整版)
- 高绩效教练的读书心得分享
- 软管出厂检测报告
- 公司业务流程与工作流程介绍
评论
0/150
提交评论