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