1. 程式人生 > >Android 實時視訊採集/編碼/傳輸/解碼/播放—方案調研

Android 實時視訊採集/編碼/傳輸/解碼/播放—方案調研

實時視訊流採集

方案一:  通過Android Camera拍攝預覽中設定setPreviewCallback實現onPreviewFrame介面,實時擷取每一幀視訊流資料 

方案二:  通過Android的MediaRecorder,在SetoutputFile函式中繫結LocalSocket實現 

方案三:  流媒體伺服器方式,利用ffmpeg或GetStreamer等獲取Camera視訊

方案四:  待補充...

壓縮編碼

方案一:  不編碼,直接通過Socket傳輸原始YUV420SP視訊幀 

方案二:  JPEG.  將原始YUV420SP視訊幀壓縮轉換為JPEG格式,JPEG傳輸 

方案三:  H.264/AVC.將原始YUV420SP視訊幀壓縮成H.264再傳輸

            常見的基於H264的開源Encoder有JM、X264、T264、Hdot264等 

方案四:  MPEG4.將原始YUV420SP視訊幀壓縮成MPEG4再傳輸

方案五:  待補充...

傳輸

方案一:  Socket傳輸

方案二:  HTTP傳輸

方案三:  RTP/RTSP傳輸

方案四:  流媒體伺服器方式,如live555等

方案五:  待補充...

解碼

與編碼對應的的解碼器

視訊播放

方案一:    通過Android  VideoView

方案二:    通過Android  MediaPlay

方案三:    通過Canvas直接貼上幀圖

方案四:    待補充...

2012-3-31  修補 

最近研究了android的實時視訊網路傳輸問題,在視訊處理方面花費了大量精力進行研究,總結出以下五套方案,並加以比較

以320×240大小的視訊傳輸為例

方案 壓縮率 壓縮/傳輸方式 實時性 平均流量消耗  傳輸距離
用camera的回撥函式傳送原始的yuv420資料 0 無壓縮,按幀傳輸 高(20~30 fps) 很高(6.5 Mbps)太恐怖了O_O  近距離有線或無線
用MediaRecorder對yuv420進行H264硬編碼後傳送 高(95%) 幀間壓縮,視訊流傳輸 高(20 fps) 低(30~70 Kbps)  可以遠距離
呼叫本地H264編碼庫(JNI)對一幀YUV420資料編碼後傳送 高(97%) 幀間壓縮,按幀傳輸 低(2 fps) 低(20 Kbps)  可以遠距離
對一幀資料用GZIP庫壓縮後傳送(很奇葩的做法) 較高(70%~80%) 幀內壓縮,按幀傳輸 低(5 fps) 較高(300 Kbps)  可以遠距離
對一幀資料用JPEG方式壓縮後傳輸 一般(60%左右) 幀內壓縮,按幀傳輸 高(25 fps) 高(170 Kbps)  可以遠距離(頻寬允許的話)

注:MediaRecorder有很強的硬體依賴性,因此不同的手機表現是不一樣的,有的手機資料傳輸的時候會出現阻塞現象,實時性就降低了