Android視頻流采集——手機(jī)錄像和PC同步_第1頁
Android視頻流采集——手機(jī)錄像和PC同步_第2頁
Android視頻流采集——手機(jī)錄像和PC同步_第3頁
Android視頻流采集——手機(jī)錄像和PC同步_第4頁
Android視頻流采集——手機(jī)錄像和PC同步_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、【轉(zhuǎn)自MacroChengAndroid視頻流采集手機(jī)錄像和PC同步2011-05-2415:32這個(gè)完全是站在巨人的肩膀上,網(wǎng)上流傳甚廣的一個(gè)帖子,只是他說他當(dāng)時(shí)調(diào)通是基于1.5的系統(tǒng)在G3上調(diào)通的,我是在NexusOne上基于2.2的系統(tǒng)調(diào)通的。但是這里所指的調(diào)通只是指PC端為Windows的,我用的Ubuntu系統(tǒng),在Ubuntu下就沒有調(diào)通,在PC端運(yùn)行出之后發(fā)送數(shù)據(jù)等等都很正常,但是就是不顯示任何圖像,很讓人郁悶,不知道有沒有那位大蝦在Linux下調(diào)通的,歡迎交流!下面就貼代碼了: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;/圖像數(shù)組privatebytebyteArray=newbytewidth*height*numBands;/圖像RGB數(shù)組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);/窗口關(guān)閉方法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);)/得到數(shù)據(jù)之后立即更新顯示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;/連接相關(guān)privateEditTextremoteIP=null;privateButtonconnect=null;privateStringremoteIPStr=nul

17、l;/視頻數(shù)據(jù)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)/連接函數(shù)/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中添加如下的權(quán)限聲明:<uses-permissionandroid:name="android.permission.CAMERA"/><uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>這樣就可以

27、跑通了,效果還是很不錯(cuò)的,我用的WIFI,所有綠屏的現(xiàn)象還是比較少的,比較流暢。遺憾的是Ubuntu下沒能調(diào)通。還需要努力阿!三步實(shí)現(xiàn)捕捉android手機(jī)攝像頭視頻流來源:賴智超的日志1 .創(chuàng)建Camera對(duì)象:varcamera:Camera=Camera.getCamera();獲取Camera對(duì)象的實(shí)例。如果攝像頭可用,返回一個(gè)Camera的對(duì)象,否則返回空。if(camera=null)trace"Nocameraisnotsupported!");)else(trace("CameraisOK");camera.setMode(800,400

28、,15,true);/設(shè)置視頻分辨率和幀頻)2 .設(shè)置使用Android攝像頭設(shè)備的權(quán)限<manifestAdditions><!CDATA<manifest><uses-permissionandroid:name="android.permission.CAMERA"/></manifest>></manifestAdditions>3 .攝像頭附加到視頻對(duì)象privatefunctionconnectCamera():void(varvideo:Video=newVideo(camera.widt

29、h,camera.height);video.attachCamera(camera);addChild(video);總結(jié)android音頻視頻操作Android播放音樂和視頻用的是類:MediaPlayer刻錄聲音和視頻用的是類:MediaRecorder拍照:Camera沒什么難度,都是調(diào)用android的API1 .刻錄視頻,關(guān)鍵代碼如下:Java代碼1. MediaRecordermediaRecorder=newMediaRecorder();2. mediaRecorder.reset();首先重置一下3. mediaRecorder.setVideoSource(MediaRe

30、corder.VideoSource.CAMERA);/從照相機(jī)種采集視頻4. mediaRecorder.setVideoSource(MediaRecorder.AudioSource.MIC);/從麥克風(fēng)中采集尸日5. mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);輸出格式3GP6. mediaRecorder.setVideoSize(350,240);視頻文件大小7. mediaRecorder.setVideoFrameRate(3);錄制幀數(shù),每秒3幀8. mediaRecorder.set

31、VideoEncoder(MediaRecorder.VideoEncoder.H263);/設(shè)置視頻編碼方式9. mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);/設(shè)置聲音編碼方式10. /*設(shè)置保存路徑為sd卡根目錄*/11. FilevideoFile=newFile(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp");12. mediaRecorder.setOutputFile(vi

32、deoFile.getAbsolutePath();13. mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface();/定義一個(gè)SurfaceView來顯示畫面14. mediaRecorder.prepare();此處要捕捉異常,底層調(diào)用硬件實(shí)現(xiàn)準(zhǔn)備工作15. mediaRecorder.start();16.17. 停止18. mediaRecorder.stop();19. mediaRecorder.release();20. mediaRecorder=null;2 .刻錄聲音,關(guān)鍵代碼如下:Java代碼

33、會(huì)。1. 與錄制視頻很相似2. mRecorder=newMediaRecorder();3. mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);/聲音來源麥克風(fēng)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 .播放聲音,關(guān)鍵代碼如下:Java代碼-,1. MediaPlayermPlayer=newMediaPlayer();2. mPlayer.reset3. mPlayer.setDataSource(mFileName);/設(shè)置播放的聲音文件4. mPlayer.prepare();5. mPlayer.start();6.7. /8. 基本方法9. mPlayer.pause()暫停播放10. mPlayer.stop()/停止播放11. mPlayer.seekTo(int)直接跳到某點(diǎn)進(jìn)行播放4 .播放視頻,關(guān)鍵代碼如下:Java代碼1. MeidaPlayermedia=newMeidaPlayer();2. media.setAudioStreamType(AudioManager.STREAM_MUSIC);3. media.setDisplay(sh);/定義一個(gè)Surf

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論