最近調(diào)研android視頻錄制、另一部手機實時觀看,大致有以下幾種思路。
1. android手機充當服務(wù)器,使用NanoHTTPD充當服務(wù)器,另一部手機或者pc通過輸入http://手機的ip:8080網(wǎng)址觀看。
這種方案可以參考 ipcamera-for-android開源項目,網(wǎng)址 http://code.google.com/p/ipcamera-for-android/source/checkout
可以運行的源代碼可以在這下載 http://download.csdn.net/detail/xiaoliouc/4933558
缺點:android手機必須支持MP4+ARM_BN格式,有些手機不兼容,延時有點厲害,前面調(diào)研在googlecode看到的代碼,現(xiàn)在看來方案不可取
2. android手機采用juv-rtmp-client.jar包,網(wǎng)上有收費的包,但可以搜索破解包,通過rtmp協(xié)議發(fā)布服務(wù)到red5服務(wù)器。服務(wù)器當然是red5了,可以用red5自帶的的OFLA Demo做測試??蛻舳舜a可以參考ivideochat,下載地址 http://download.csdn.net/detail/xiaoliouc/4933594
使用支持rtmp協(xié)議的播放器播放,如ffplay
缺點:demo延遲很厲害,僅供參考。rtmp協(xié)議半公開,難度比較大
3.android手機通過camera類拍攝視頻。把一幀一幀的圖像壓縮通過socket發(fā)送到服務(wù)器,服務(wù)器可以直接觀看。而要想讓另一臺手機也能觀看,可以讓服務(wù)器轉(zhuǎn)發(fā)來實現(xiàn)。
例子網(wǎng)上有很多, http://download.csdn.net/detail/xiaoliouc/4933610
缺點:通過一幀一幀的發(fā)送數(shù)據(jù),傳輸過程耗費大量流量。玩玩可以,但實際項目中不可取。
4.android手機通過camera類拍攝視頻,把拍攝的視頻通過h264編碼,可以采用軟編碼(使用x264庫或者opencore軟件庫),java類通過jni調(diào)用編譯后的so文件來實現(xiàn)。然后通過基于udp的rtp協(xié)議傳輸?shù)椒?wù)器。為什么不使用tcp協(xié)議呢,因為tcp的重傳機制會產(chǎn)生延時和抖動,而單獨使用udp傳輸協(xié)議本身是面向無連接的,不能提供質(zhì)量保證,需要在udp協(xié)議只上采用rtp或者rtcp提供流量控制和擁塞控制服務(wù)。服務(wù)器通過ffmpeg對接收的h264解碼并播放。播放可以使用VLC media player。如果對c++比較熟悉,可以看看live555這個開源項目。
缺點:需要懂得的知識很多,jni啊,h264編碼解碼 ,rtp協(xié)議等。使用軟編碼,效率比較低,且視頻質(zhì)量較差。
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
代碼網(wǎng)上有很多,個人理解是:mediaRecorder錄制視頻(3gp,MP4),可以通過mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());預(yù)覽視頻,通過localsocket發(fā)送到本地的localserversocket的h264實時視頻流。
這個過程涉及到硬編碼,硬編碼個人理解是,在預(yù)覽過程或者提前確定視頻的sps,pps,head(一般為0x00000001),不同的手機硬件不一樣。把得到的這些參數(shù)寫入h264,得到正確的h264視頻流,然后把流推送到流媒體服務(wù)器,使用支持rtsp協(xié)議的播放器播放,比如vlc。
6、采用HLS協(xié)議,服務(wù)器采用nginx,ffmpeg解碼。nginx服務(wù)器搭建過程,ffmpeg安裝過程 見我前幾篇文章。
然后用ffmpeg對解碼后的mp4文件進行ts切片,生成帶有索引的m3u8文件,然后客戶端就可以通過瀏覽器http://ip :port/ *.m3u8訪問。
過程貌似是這樣的,但自己由于剛接觸不到一個周,還不太理解。
6.相對容易、且效果不錯的方法,android手機上搭建rtsp服務(wù)器,另一臺手機使用VLC播放器輸入rtsp://ip:port/播放視頻。具體原理是,通過android手機對mediaRecorder錄制視頻,把localsocket傳輸?shù)奖镜氐牧鹘?jīng)過硬編碼,添加rtp頭,分離NALU包,根據(jù)rtsp協(xié)議交互過程把數(shù)據(jù)發(fā)送到對方。
代碼可以參考spydroid了,源代碼可以通過svncheckout,能夠正常運行,且效果不錯。
http://code.google.com/p/spydroid-ipcamera/source/checkout 。網(wǎng)上還沒有分析spydroid源碼的文章,等自己空了有機會分析下源代碼。
7.前面講的都是單向視頻,如果是雙向視頻,其實就是視頻會議了,可以參考sipdroid開源源代碼了,網(wǎng)址 http://code.google.com/p/sipdroid/source/checkout
由于沒有時間,就不研究這個了。
聯(lián)系客服