Android實現實時視頻通話或監控方案

Android實現實時視頻通話或監控、另一部手機實時觀看,大致有以下幾種思路。

 

1. android手機充當服務器,使用NanoHTTPD充當服務器,另一部手機或者pc通過輸入http://手機的ip:8080網址觀看。這種方案可以參考 ipcamera-for-android開源項目,

網址http://code.google.com/p/ipcamera-for-android/source/checkout

可以運行的源代碼可以在這下載 http://download.csdn.net/detail/xiaoliouc/4933558

 

缺點:android手機必須支持MP4+ARM_BN格式,有些手機不兼容,延時有點厲害

 

2. android手機採用juv-rtmp-client.jar包,網上有收費的包,但可以搜索破解包,通過rtmp協議發佈服務到red5服務器。服務 器當然是red5了,可以用red5自帶的的OFLA Demo做測試。客戶端代碼可以參考ivideochat,

下載地址http://download.csdn.net/detail/xiaoliouc/4933594

 

電腦可以直接通過安裝了flash player瀏覽器觀看,手機呢,可以找一個支持rtmp協議的播放器了。

缺點:需要flash支持

 

3.android手機通過camera類拍攝視頻。把一幀一幀的圖像壓縮通過socket發送到服務器,服務器可以直接觀看。而要想讓另一臺手機也能觀看,可以讓服務器轉發來實現。

例子網上有很多,例如 http://download.csdn.net/detail/xiaoliouc/4933610


缺點:通過一幀一幀的發送數據,傳輸過程耗費大量流量。玩玩可以,但實際項目中不可取。

 

4.android手機通過camera類拍攝視頻,把拍攝的視頻通過h264編碼,可以採用軟編碼(使用x264庫或者opencore軟件 庫),java類通過jni調用編譯後的so文件來實現。然後通過基於udp的rtp協議傳輸到服務器。爲什麼不使用tcp協議呢,因爲tcp的重傳機制 會產生延時和抖動,而單獨使用udp傳輸協議本身是面向無連接的,不能提供質量保證,需要在udp協議只上採用rtp或者rtcp提供流量控制和擁塞控制 服務。服務器通過ffmpeg對接收的h264解碼並播放。播放可以使用VLC media player。如果對c++比較熟悉,可以看看live555這個開源項目。


缺點:需要懂得的知識很多,jni啊,h264編碼解碼 ,rtp協議等。使用軟編碼,效率比較低,耗cpu耗電啊。

 

5.android手機通過mediaRecorder類拍攝視頻,其中當然包括音頻了。把拍攝的視頻通過h264編碼,可以採用硬編碼(面向手機的硬件直接操作),只能針對3gp,mp4視頻格式。

方法參考http://blog.csdn.net/zblue78/article/details/6078040

這篇博客,裏面講的很詳細,提取h264的sps,pps,

可以參考 http://blog.csdn.net/peijiangping1989/article/details/6934317     

winHex是一款好用的16進制查看工具,下載地址http://download.csdn.net/detail/xiaoliouc/4928773

 

代碼網上有很多,個人理解是:mediaRecorder錄製視頻(3gp,MP4),可以通過 mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());預覽視頻,通過 localsocket發送到本地的localserversocket的h264實時視頻流。

這個過程涉及到硬編碼,硬編碼個人理解是,在預覽過程或者提前確定視頻的sps,pps,head(一般爲0x00000001),不同的手機硬件 不一樣。把得到的這些參數寫入h264,得到正確的h264視頻流文件,然後把流通過rtp協議(或者其他)發送到服務器。服務器端對得到的h264用 ffmepg解碼,播放。

 

貌似項目客戶需要在蘋果電腦,手機上播放。這個時候HLS協議就出來了,頭疼的東西,服務器採用nginx,ffmpeg解碼。nginx服務器搭建過程,ffmpeg安裝過程見我前幾篇文章。   

然後用ffmpeg對解碼後的mp4文件進行ts切片,生成帶有索引的m3u8文件,然後客戶端就可以通過瀏覽器http://ip :port/ *.m3u8訪問。

 

過程貌似是這樣的,但自己由於剛接觸不到一個周,還不太理解。

 

 6.相對容易、且效果不錯的方法,android手機上搭建rtsp服務器,另一臺手機使用VLC播放器輸入rtsp://ip:port/播放視頻。具體原理是,通過android手機對mediaRecorder錄製視頻,把localsocket傳輸到本地的流經過硬編碼,添加rtp頭,分離NALU包,根據rtsp協議交互過程把數據發送到對方。

 

代碼可以參考spydroid了,源代碼可以通過svncheckout,能夠正常運行,且效果不錯。

 http://code.google.com/p/spydroid-ipcamera/source/checkout。網上還沒有分析spydroid源碼的文章,等自己空了有機會分析下源代碼。

 

7.前面講的都是單向視頻,如果是雙向視頻,其實就是視頻會議了,可以參考sipdroid開源源代碼了,網址http://code.google.com/p/sipdroid/source/checkout


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章