




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單面窗戶采購合同范本
- 司機(jī)協(xié)議合同范例
- 業(yè)務(wù)員簡(jiǎn)單辭職報(bào)告
- 通信網(wǎng)絡(luò)管理員高級(jí)考試模擬題含參考答案
- 辦卡會(huì)員合同范本
- 農(nóng)村固體廢物處理合同范本
- 一周總結(jié)30篇模板
- 壓路機(jī)租用合同范本
- 公司出售寫合同范例
- 2014旅游協(xié)議合同范本
- 富血小板血漿(PRP)簡(jiǎn)介
- 住院患者導(dǎo)管滑脫風(fēng)險(xiǎn)評(píng)估表
- 幼兒園大班音樂教案《我們多快樂》
- 《草船借箭》課本劇劇本-4篇
- 2024年山東服裝職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 團(tuán)播主持人協(xié)議
- 電梯維保經(jīng)營計(jì)劃書
- 蘇教版二年級(jí)科學(xué)下冊(cè)第7課《栽小蔥》課件PPT
- 市政道路工程質(zhì)量保證措施
- 網(wǎng)店運(yùn)營管理(第二版)課件全套 段文忠 第1-9章 網(wǎng)店運(yùn)營基本原理- 戰(zhàn)略化運(yùn)營 動(dòng)態(tài)競(jìng)爭(zhēng)
- ISO22000體系文件清單
評(píng)論
0/150
提交評(píng)論