最近調研android視頻錄製、另外一部手機實時觀看,大體有如下幾種思路。java
1. android手機充當服務器,使用NanoHTTPD充當服務器,另外一部手機或者pc經過輸入http://手機的ip:8080網址觀看。android
這種方案能夠參考 ipcamera-for-android開源項目,網址 http://code.google.com/p/ipcamera-for-android/source/checkoutnginx
能夠運行的源代碼能夠在這下載 http://download.csdn.net/detail/xiaoliouc/4933558c++
缺點: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協議的播放器了。socket
缺點:須要flash支持tcp
3.android手機經過camera類拍攝視頻。把一幀一幀的圖像壓縮經過socket發送到服務器,服務器能夠直接觀看。而要想讓另外一臺手機也能觀看,可讓服務器轉發來實現。ide
例子網上有不少, http://download.csdn.net/detail/xiaoliouc/4933610svn
缺點:經過一幀一幀的發送數據,傳輸過程耗費大量流量。玩玩能夠,但實際項目中不可取。
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
因爲沒有時間,就不研究這個了。