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有很強的硬體依賴性,因此不同的手機表現是不一樣的,有的手機資料傳輸的時候會出現阻塞現象,實時性就降低了