1. 程式人生 > >語音/短視訊 :錄製(編碼)和播放(解碼)

語音/短視訊 :錄製(編碼)和播放(解碼)

  IM軟體就需要即時通訊技術、視訊軟體就需要視訊編解碼技術、遊戲就需要引擎技術。
  檢視原始碼的工具:sourceinsight , 不瞭解JNI的一定要學習下,否則只能在JAVA層搞,太狹隘了。

音視訊採集–壓縮編碼–封裝–推流–分發–流媒體協議觀看.

 音視訊流程:視訊採集→視訊預處理→視訊編碼與封裝→資料的儲存/傳輸→視訊解封裝/解碼→視訊後處理→視訊輸出。
 音視訊的錄製、播放、編碼、上傳、下載、觀看等

 容器格式:常見的視訊容器格式有avi、mp4、mkv、flv、rm/rmvb、mov、ts、vob、dat,音訊容器格式有MP3、WAV、AAC、APE,FLAC等
 壓縮格式:視訊壓縮格式如mpeg2、mpeg4、H264、VC1、Rm/Rmvb,常見音訊壓縮格式如MPA、AAC、AC3、DTS。

視訊編碼入門概念- http://blog.csdn.net/ZSZ_shsf/article/details/79152633
1.音視訊的錄製MediaRecorder;

2.播放
Android使用MediaRecorder和Camera實現視訊錄製及播放功能整理- http://blog.csdn.net/woshizisezise/article/details/51878566
Android三種播放視訊的方式:1、呼叫其自帶的播放器;2、使用VideoView來實現;3、使用MediaPlayer

3.視訊預處理
multimedia framework VitamioBundle- https://github.com/yixia/VitamioBundle
Android中可以使用MediaCodec來訪問底層的媒體編解碼器,可以對媒體進行編/解碼。
MediaCodec可以處理的資料有以下三種類型:壓縮資料、原始音訊資料、原始視訊資料。MediaExtractor和MediaMuxer

4.視訊編碼與封裝
  通常來說,對於同一平臺同一硬體環境,硬編硬解的速度是快於軟體編解碼的。而且相比軟體編解碼的高CPU佔用率來說,硬體編解碼也有很大的優勢,所以在硬體支援的情況下,一般硬體編解碼是我們的首選。
  在Android中,我們可以直接使用MediaRecord來進行錄影,但是在很多適合MediaRecord並不能滿足我們的需求,比如我們需要對錄製的視訊加水印或者其他處理後,所有的平臺都按照同一的大小傳輸到伺服器等
  利用AudioRecord錄音,利用OpenGL渲染相機資料並做處理。然後利用MediaCodec對音訊和視訊分別進行編碼,使用MediaMuxer將編碼後的音視訊進行混合儲存為Mp4的編碼過程。
 Android硬體編碼-音視訊編碼以及音視訊混合- http://blog.csdn.net/zhaodebbs/article/details/65630487
 MP4封裝格式結構圖:用EsEYE檢視;用winhex分析

5.視訊資料的儲存/傳輸 (實時錄製 實時傳輸)
android實時視訊網路傳輸方案總結(一共有五套)- http://blog.csdn.net/xiangjai/article/details/12908671
Android 實時視訊採集/編碼/傳輸/解碼/播放—方案調研(初)- https://www.cnblogs.com/skyseraph/archive/2012/03/23/2415018.html
  檔案上傳,斷點續傳
  android 選擇視訊檔案 上傳到後臺伺服器- http://blog.csdn.net/d276031034/article/details/52652749
  okhttp實現斷點上傳- https://github.com/handsometong/okhttpUpLoader
  有找到一個案例也是採用Socket作為上傳方式(大檔案上傳,不適合使用POST,GET形式)。由於大資料夾不適合http上傳的方式,所以就想能不能把大檔案切割成n塊小檔案,然後上傳這些小檔案,所有小檔案全部上傳成功後再在伺服器上進行拼接。這樣不就可以實現斷點上傳,又解決了http不適合上傳大檔案的難題了嗎!制定方案採用分塊順序上傳,最後確定採用http協議來實現。
android Http分塊順序上傳大視訊

6.視訊解封裝/解碼(播放器即解碼器)
 解碼流程:input file(Demuxer)> Encoded data packets(decoder)> decoded frames(Encoded)> Encoded data packets(muxer)> output file
 h.264視訊。用android標準的API (MediaCodec)實現視訊的硬體編解碼。
 Android 用MediaCodec實現視訊硬解碼(轉)- https://www.cnblogs.com/welhzh/p/3779616.html
 https://github.com/yixia/VitamioBundle

7.視訊後處理
  視訊美顏/濾鏡
  是對音訊處理還是對視訊處理。音訊是去噪音、去迴音、混音???視訊 加水印 美顏 ???還是對音視訊容器層處理?

8.視訊輸出(視訊下載)
 檔案下載,斷點下載
  視訊流的傳輸,往往有兩種協議,一種是HTTP,一種是RTSP。兩種協議最大的不同是,HTTP協議,不支援實時流媒體的播放,而RTSP協議就支援。
 多執行緒、斷點續傳下載;下載管理:開始、暫停、繼續、取消、重新開始
 okhttp,OkHttpManager類
  基於okhttp的檔案下載、上傳工具- https://github.com/Othershe/DUtil

 - 系統提供的下載管理器進行下載
//建立下載任務,downloadUrl就是下載連結
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl));
//指定下載路徑和下載檔名
request.setDestinationInExternalPublicDir("/download/", fileName);
//獲取下載管理器
DownloadManager downloadManager= (DownloadManager) 
mContext.getSystemService(Context.DOWNLOAD_SERVICE);
//將下載任務加入下載佇列,否則不會進行下載
downloadManager.enqueue(request);

檔案下載:
URL url=new URL(urlStr);  
                HttpURLConnection conn=(HttpURLConnection)url.openConnection();  
                //取得inputStream,並進行讀取  
                InputStream input=conn.getInputStream();  
                BufferedReader in=new BufferedReader(new InputStreamReader(input));  
                String line=null;  
                StringBuffer sb=new StringBuffer();  
                while((line=in.readLine())!=null){  
                    sb.append(line);  
                }

安卓通用Http檔案下載管理器FileDownloader(https://github.com/wlfcolin/file-downloader)