近兩年來直播行業越來越火,各個直播平台加一起差不多300多家。有些直播平台做秀場、綜娛類的直播(來瘋直播),有的做遊戲直播(熊貓直播),有的做體育賽事的直播(樂視直播),分類也各種各樣。下面一張圖很好地反映了國內直播平台的大致分類。
直播平台
本人有幸參與到了來瘋android手機直播的研發,本著技術分享的精神,現在寫一系列的文章來介紹安卓手機直播,一方面希望能幫助大家了解android手機直播相關的技術,另一方面也當作是自己工作一段時間的總結。
注:1、這系列文章只涉及android手機直播相關知識;2、整個專案已經開源(開源位址)
直播架構設計圖
檢測攝像頭是否可以使用;音訊採集技術要點:攝像頭採集到的影象是橫向的,需要對採集到的影象進行一定的旋轉後再進行顯示;
攝像頭採集時有一系列的影象大小可以選擇,當採集的影象大小和手機螢幕大小比例不一致時,需要進行特殊處理;
android手機攝像頭有一系列的狀態,需要在正確的狀態下才能對攝像頭進行相應的操作;
android手機攝像頭的很多引數存在相容性問題,需要較好地處理這些相容性的問題。
檢測麥克風是否可以使用;需要檢測手機對某個音訊取樣率的支援;
在一些情況下需要對音訊進行回聲消除處理;
音訊採集時設定正確的緩衝區大小。
美顏流程
下面的很好地展示了美顏和動畫效果。
美顏
動畫特效和水印
音訊處理
通過攝像頭和麥克風我們可以採集到相應的視音訊資料,但是這些是固定格式的原始資料,一般來說攝像頭採集到的是一幀一幀畫面,而麥克風採集的是pcm音訊資料。如果直接將這些資料進行傳送,這樣往往會資料量很大,造成很大的頻寬浪費,因此在傳送前往往需要對視音訊進行編碼。
變換編碼
音訊編碼
android中利用audiorecord可以錄製聲音,錄製出來的聲音是pcm聲音。想要將聲音用計算機語言表述,則必須將聲音進行數位化。將聲音數位化,最常見的方式是透過脈衝編碼調製pcm(pulse code modulation) 。聲音經過麥克風,轉換成一連串電壓變化的訊號。要將這樣的訊號轉為 pcm 格式的方法,是使用三個引數來表示聲音,它們是:聲道數、取樣位數和取樣頻率。
1、取樣頻率
即取樣頻率,指每秒鐘取得聲音樣本的次數。取樣頻率越高,聲音的質量也就越好,聲音的還原也就越真實,但同時它佔的資源比較多。由於人耳的解析度很有限,太高的頻率並不能分辨出來。在16位音效卡中有22khz、44khz等幾級,其中,22khz相當於普通fm廣播的音質,44khz已相當於cd音質了,目前的常用取樣頻率都不超過48khz。
2、取樣位數
即取樣值或取樣值(就是將取樣樣本幅度量化)。它是用來衡量聲音波動變化的乙個引數,也可以說是音效卡的解析度。它的數值越大,解析度也就越高,所發出聲音的能力越強。
在計算機中取樣位數一般有8位和16位之分,但有一點請大家注意,8位不是說把縱座標分成8份,而是分成2的8次方即256份; 同理16位是把縱座標分成2的16次方65536份。
3、聲道數
很好理解,有單聲道和立體聲之分,單聲道的聲音只能使用乙個喇叭發聲(有的也處理成兩個喇叭輸出同乙個聲道的聲音),立體聲的pcm可以使兩個喇叭都發聲(一般左右聲道有分工) ,更能感受到空間效果。
那麼,現在我們就可以得到pcm檔案所佔容量的公式:
儲存量=(取樣頻率 ✖️ 取樣位數 ✖️ 聲道 ✖️ 時間)➗ 8 (單位:位元組數)
視音訊在傳輸過程中需要定義相應的格式,這樣傳輸到對端的時候才能正確地被解析出來。
還有其他幾種形式的協議,比如rtp等等,大致原理差不多,也就不一一進行說明講述了。
好的網路下視音訊能夠得到及時的傳送,不會造成視音訊資料在本地的堆積,直播效果流暢,延時較小。而在壞的網路環境下,視音訊資料傳送不出去,則需要我們對視音訊資料進行處理。差網路環境下對視音訊資料一般有四種處理方式:快取區設計、網路檢測、丟幀處理、降位元速率處理。
1、緩衝區設計
視音訊資料傳入緩衝區,傳送者從緩衝區獲取資料進行傳送,這樣就形成了乙個非同步的生產者消費者模式。生產者只需要將採集、編碼後的視音訊資料推送到緩衝區,而消費者則負責從這個緩衝區裡面取出資料傳送。
視音訊緩衝區
2、網路檢測
差網路處理過程中乙個重要的過程是網路檢測,當網路變差的時候能夠快速地檢測出來,然後進行相應的處理,這樣對網路反應就比較靈敏,效果就會好很多。
我們這邊通過實時計算每秒輸入緩衝區的資料和傳送出去資料,如果傳送出去的資料小於輸入緩衝區的資料,那麼說明網路頻寬不行,這時候緩衝區的資料會持續增多,這時候就要啟動相應的機制。
4、降位元速率
在android中,如果使用了硬編進行編碼,在差網路環境下,我們可以實時改變硬編的位元速率,從而使直播更為流暢。當檢測到網路環境較差的時候,在丟幀的同時,我們也可以降低視音訊的位元速率。在android sdk版本大於等於19的時候,可以通過傳遞引數給mediacodec,從而改變硬編編碼器出來資料的位元速率。
經過各種處理,最後需要將資料傳送出去,這一步較為簡單。無論是http-flv,還是rtmp,我們這邊都是使用tcp建立連線的。直播開始之前需要通過socket連線伺服器,驗證是否能連線伺服器,連線之後便使用這個socket向伺服器傳送資料,資料傳送完畢後關閉socket。bundle bitrate = new bundle();bitrate.putint(mediacodec.parameter_key_video_bitrate, bps * 1024);
mmediacodec.setparameters(bitrate);
android手機直播(一)總覽
android手機直播(二)攝像機
android手機直播(三)聲音採集
android手機直播(四)android media api
51微控制器(一) 總覽
要使微控制器正常工作,需要在vcc腳上給予5v 3.3v的電壓,將gnd腳接地。為了濾波 vcc和gnd之間接兩個電容。xtal上接乙個外部振盪器,rst腳上接外部復位電路。雖然這些都已經標準化,無關程式設計。但在某些特殊情況下 比如晶振 穩壓晶元壞了,虛焊等等 需要配合示波器等作出硬體故障的排除,...
LaTeX學習筆記一 總覽篇
排版架構 數學公式編輯 形如 documentclass 或 documentclass utf8 的指令,反斜槓開頭,反斜槓後的內容類似 函式 和 入口引數 用來控制文件效果。例如這裡的控制符是documentclass,意味著控制文字型別,這裡是 utf8 編碼,型別。用控制序列 usepack...
Unity2019 3API教程(一)總覽目錄
前段時間發部落格說今年會準備出書編寫有關unity2019.3版本的引擎教程和api教程,結果因為比較忙耽擱了程序,現在將內容發布csdn部落格上,後期整合成書籍,並且準備先解析有關api的問題。原慾望將api內容完整的從頭到尾進行解析,但是根據個人經驗與精力問題,unity常用的api只有那麼幾個...