C++語言的音影片開發應用模式(採集、編碼、解碼...)
在很多即時通訊應用中,會根據應用場景的不同,需要對音訊輸入源進行選擇,不同的應用場景對應不同的音訊工作模式。需要支援多種音訊工作(採集)模式,包括:
1、發言模式(預設):自動選擇麥克風為音訊輸入源裝置,使用者說話的聲音被麥克風採集,啟動音訊特效處理(包括:迴音消除、靜音檢測、噪音抑制、自動增溢),該模式通常應用於互動交流,使用者發言討論等場合;
2、放歌模式:自動選擇立體聲混音輸入源裝置,本地計算機所播放的聲音被採集,同時SDK內部會自動遮蔽其它使用者的聲音(如果不遮蔽,則使用者的聲音會被採集下來,並回傳給使用者,使用者那邊將會聽到迴音),SDK內部會自動關閉音訊特效處理,該模式通常應用於向其他使用者放歌,而不用關心其他使用者發言的場合;
3、卡拉OK模式:自動選擇立體聲混音和麥克風兩個輸入源裝置(該特性與硬體相關,有些音效卡不支援同時採集麥克風和立體聲混音),本地計算機所播放的聲音和使用者說話的聲音將會被採集,同時SDK內部會自動遮蔽其它使用者的聲音,SDK內部會自動關閉音訊特效處理,該模式通常應用於向其他使用者放歌,同時自己用麥克風伴唱,而不用關心其它使用者發言的場合;
4、線路輸入模式:自動選擇線路輸入源裝置,透過線路輸入的聲音將被採集(通常是指將外部的DV、DVD、TV等裝置的音訊輸出端子接入音效卡的LineIn口的應用),SDK內部會自動關閉音訊特效處理,該模式通常應用於向其他使用者播放外部裝置的聲音,而不需要自己講話的場合,如向房間的所有使用者直播電視訊號時,可將電視的影片輸出接入專用的影片採集卡,而將電視的聲音輸出接入音效卡的LineIn介面,並選擇“線路輸入模式”,那麼當前房間內的其它使用者就可以收看到實時的電視畫面與聲音了。
典型修改音訊工作模式的程式碼如下:
1.DWORD dwAudioMode = 1; // 修改為放歌模式
2.BRAC_SetSDKOption(BRAC_SO_AUDIO_CPATUREMODE,(PCHAR)&dwAudioMode,sizeof(dwAudioMode));
初始化自動啟動“發言模式”,如需要切換到其它的工作模式,需要透過相應的介面設定,在 初始化成功後,可動態切換,由於切換過程中,內部會自動選擇對應的源裝置,故切換後,上層應用需要更新當前的音訊採集裝置,以及對應的音訊特效狀態等標誌。
根據模式的不同和網路狀態的不同,動態調節播放緩衝區的大小,從而來控制播放延遲,如發言模式下,當網路條件好的情況下,平均延遲<300ms,當網路條件不好的情況下,平均延遲<800ms;而放歌模式等其它非發言模式,延遲將會隨網路狀態的變化而變化。總的來說,發言模式延遲小,保障實時性,非發言模式,如放歌模式,則延遲會稍大,保障流產性。
自動記錄最後一次上層應用所選擇的工作模式,下次重新執行後,會自動啟用前次記錄的工作模式,如果不期望SDK記錄前次工作模式,則可透過關閉的配置檔案來實現。
影片質量主要是透過伺服器的配置檔案來控制,該配置是整個系統所有房間的預設配置,早期的版本無法實現由上層應用來控制不同的使用者採用不同的影片質量引數,本地影片質量控制介面,可以由上層應用控制本地影片的編碼質量,為某些特定的應用提供了基礎,例如:可以實現主持人發言時採用高質量的影片引數,而普通使用者採集一般的影片引數,從而達到發言者的影片效果優於普通使用者的特定效果。(如果採集的影片訊號有“橫條”干擾)
本地影片質量控制介面可以調節的引數包括“影片幀率”、“影片位元速率”、“影片質量”、“關鍵幀間隔”以及“預設引數”的控制,引數定義如下:
01.///< 本地影片編碼位元速率設定(引數為int型,同伺服器配置:VideoBitrate)
02.#define BRAC_SO_LOCALVIDEO_BITRATECTRL 30
03.///< 本地影片編碼質量因子控制(引數為int型,同伺服器配置:VideoQuality)
04.#define BRAC_SO_LOCALVIDEO_QUALITYCTRL 31
05.///< 本地影片編碼關鍵幀間隔控制(引數為int型,同伺服器配置:VideoGOPSize)
06.#define BRAC_SO_LOCALVIDEO_GOPCTRL 32
07.///< 本地影片編碼幀率控制(引數為int型,同伺服器配置:VideoFps)
08.#define BRAC_SO_LOCALVIDEO_FPSCTRL 33
09.///< 本地影片編碼預設引數控制(引數為int型,1-5)
10.#define
BRAC_SO_LOCALVIDEO_PRESETCTRL 34
其中影片質量控制有兩種模式“平均位元速率模式”(預設設定)和“質量因子模式”,當設定的位元速率大於0時,啟動“平均位元速率模式”,當設定的位元速率為0時,啟動“質量因子模式”。
典型的設定“平均位元速率模式”引數程式碼如下:
01.DWORD dwValue = 0;
02.// 設定本地影片編碼的位元速率
03.dwValue = 60 * 1000; // 60 kbps
04.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_BITRATECTRL,(const char*)&dwValue,sizeof(DWORD));
05.// 設定本地影片編碼的關鍵幀間隔
06.dwValue = 20;
07.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_GOPCTRL,(const char*)&dwValue,sizeof(DWORD));
08.// 設定本地影片編碼的幀率
09.dwValue = 8;
10.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_FPSCTRL,(const char*)&dwValue,sizeof(DWORD));
11.// 設定本地影片編碼的預設引數
12.dwValue = 3;
13.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_PRESETCTRL,(const char*)&dwValue,sizeof(DWORD));
14.// 使引數設定生效
15.BOOL bUseAppParam = TRUE;
16.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_APPLYPARAM,(const char*)&bUseAppParam,sizeof(DWORD));
典型的設定“質量因子模式”引數程式碼如下:
01.DWORD dwValue = 0;
02.// 設定本地影片編碼的位元速率
03.dwValue = 0;
04.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_BITRATECTRL,(const char*)&dwValue,sizeof(DWORD));
05.// 設定本地影片編碼的質量因子
06.dwValue = 4;
07.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_QUALITYCTRL,(const char*)&dwValue,sizeof(DWORD));
08.// 設定本地影片編碼的關鍵幀間隔
09.dwValue = 20;
10.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_GOPCTRL,(const char*)&dwValue,sizeof(DWORD));
11.// 設定本地影片編碼的幀率
12.dwValue = 8;
13.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_FPSCTRL,(const char*)&dwValue,sizeof(DWORD));
14.// 設定本地影片編碼的預設引數
15.dwValue = 3;
16.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_PRESETCTRL,(const char*)&dwValue,sizeof(DWORD));
17.// 使引數設定生效
18.BOOL bUseAppParam = TRUE;
19.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_APPLYPARAM,(const char*)&bUseAppParam,sizeof(DWORD));當啟動“平均位元速率模式”時,質量因子的引數設定仍然有效,只是系統會限制輸出的最高位元速率。另外要使設定的引數生效,需要呼叫“BRAC_SetSDKOption”介面並使用“BRAC_SO_LOCALVIDEO_APPLYPARAM”標誌啟用所設定的引數,同時也可利用該標誌恢復伺服器配置的預設影片質量引數。
更多的關於影片質量引數可以到
關於影片幀率與關鍵幀間隔的引數設定可參考如下原則:
1、幀率越高,影片越流暢(最大值為25fps),同時幀率也會對位元速率和CPU資源佔用產生一定的影響,通常的建議是網際網路應用(8-12fps),區域網應用(18-25fps);
2、關鍵幀間隔是指在編碼的過程中,兩個關鍵幀之間非關鍵幀的數量,值越大,位元速率越小,但會降低影片的質量,值越小,位元速率越大,影片質量較好,但不宜過小,通常的建議是網際網路應用(幀率的3、4倍),區域網應用(等於幀率),不要小於幀率;
關於本地影片編碼的預設引數:BRAC_SO_LOCALVIDEO_PRESETCTRL,其取值範圍為1-5,主要用來控制CPU資源佔用率和畫面細節,值越小,編碼時的CPU佔用率越低,但會損失對畫面細節的處理;值越大,編碼時的CPU佔用率越高,但對畫面細節的處理會更細膩,該引數主要針對高位元速率有效,低位元速率時由於位元速率的限制,影片畫面細節無法表現出來,所以低位元速率模式下,可以將該引數調節低一些,以降低CPU的利用率。
關於本地影片編碼的位元速率引數:BRAC_SO_LOCALVIDEO_BITRATECTRL,單位為bps,位元速率越小,影片質量越差;位元速率越高,影片質量越好,同時該引數還與影片畫面的分辯率有關,不同的解析度有不同的取值範圍,如在網際網路應用狀態下,分辯率是176x144典型的取值範圍是(10kbps ~ 60kbps),解析度是320x240典型的取值範圍是50kbps ~ 120kbps,如果是區域網應用,則位元速率可適當提高。
關於本地影片編碼的質量因子引數:BRAC_SO_LOCALVIDEO_QUALITYCTRL,取值範圍為1-6,值越小,畫面質量越低,輸出位元速率也越低,值越大,畫面質量越高,輸出位元速率也越高。
關於“平均位元速率模式”和“質量因子模式”兩種影片質量控制模式的區別和應用,可參考如下原則:
1、“平均位元速率模式”:影片編碼時以輸出位元速率為優先考慮條件,當畫面靜止時,輸出的位元速率較低,動態畫面位元速率會較高,瞬時位元速率可能會超過設定的引數(最高不會超過10%),但是其輸出的影片資料平均位元速率將會維持在設定的引數附近,當畫面運動量過大時,編碼器為了維持平均位元速率,將會損失畫面的質量,通常網際網路應用可採用該模式;
2、“質量因子模式”:當位元速率引數設定為0時,該模式生效,影片編碼時以影片質量為優先考慮條件,靜止的畫面和動態畫面將會用不同的量化因子進行編碼,維持在一個固定的畫面質量下,當畫面靜止時,位元速率較低,當畫面運動時,位元速率較高,通常區域網應用可採用該模式。由於該模式下沒有限制位元速率,所以大運動量畫面時,為了保持固定的畫面質量,位元速率的變化將會比較大,所以該模式不適合於網際網路應用。
3、如果希望在網際網路的環境下獲得較高質量的影片效果(在網路頻寬許可的情況下),建議採用“平均位元速率模式”,只是可以適當提高影片質量引數(VideoQuality)的值,影片位元速率引數根據需要進行設定。低位元速率,配置較低的影片質量,高位元速率就需要配置較高的影片質量。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30004768/viewspace-1328455/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Qt/C++音影片開發79-採集websocket影片流/開啟ws開頭的地址/音影片同步/儲存到MP4檔案/影片回放QTC++Web
- 音視訊入門之音訊採集、編碼、播放音訊
- C++實現RTMP協議傳送H.264編碼及AAC編碼的直播軟體開發音影片C++協議
- 轉載:iOS音視訊實時採集硬體編碼iOS
- Android短影片系統硬編碼—實現音影片編碼(三)Android
- Android短影片系統硬編碼—實現音影片編碼(二)Android
- 音影片編解碼技術在直播平臺中是如何運用的?
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- Linux設定語言編碼(字符集)Linux
- 深度瞭解語音識別之發音詞典及語音資料採集標註
- C++ 的指令碼語言:ChaiScriptC++指令碼AI
- 編譯語言、解釋語言與指令碼語言之間的區別編譯指令碼
- C++編碼命名規範 -- 目前應用C++
- 嵌入式開發該採用C++編寫嗎C++
- android 音訊採集、FLTP重取樣與AAC編碼推流Android音訊
- 用C++從0開始開發自己的程式語言C++
- Java語言編碼規範Java
- java編譯、編碼、語言設定Java編譯
- 計算機程式語言的分類,解釋型語言、編譯型語言、指令碼語言的關係計算機編譯指令碼
- ios應用開發+swift語言入門iOSSwift
- Streem:Ruby之父開發的新指令碼語言指令碼
- PACS系統原始碼 採用VC++程式語言開發 帶3維重建和還原功能原始碼C++
- 音訊編解碼標準音訊
- 用於將位元組進行base64編碼或解碼(C語言實現)C語言
- 幽默:儘量用領域語言編寫程式碼
- 影片場景下的自然語言處理應用自然語言處理
- 利用爬蟲採集音訊資訊完整程式碼示例爬蟲音訊
- 短影片app開發,叢集容錯策略的程式碼分析APP
- 語音直播系統原始碼開發語音直播系統部署搭建原始碼
- 人工智慧解讀唇語 不止能解碼語音和語言翻譯人工智慧
- 低程式碼開發:企業應用構建新模式模式
- Uber Go 語言編碼規範Go
- Linux指令碼語言PERL 的模板應用分析(轉)Linux指令碼
- 前端開發中的字元編碼詳解前端字元
- 【iOS開發】如何用 Swift 語言進行LBS應用的開發?iOSSwift
- 使用Go語言開發iOS應用(Swift版)GoiOSSwift
- FFmpeg開發筆記(十九)FFmpeg開啟兩個執行緒分別解碼音影片筆記執行緒
- 【秒懂音視訊開發】14_AAC編碼