C++語言的音影片開發應用模式(採集、編碼、解碼...)

bbbrrr123發表於2014-11-11

在很多即時通訊應用中,會根據應用場景的不同,需要對音訊輸入源進行選擇,不同的應用場景對應不同的音訊工作模式。需要支援多種音訊工作(採集)模式,包括:
    1、發言模式(預設):自動選擇麥克風為音訊輸入源裝置,使用者說話的聲音被麥克風採集,啟動音訊特效處理(包括:迴音消除、靜音檢測、噪音抑制、自動增溢),該模式通常應用於互動交流,使用者發言討論等場合;
    2、放歌模式:自動選擇立體聲混音輸入源裝置,本地計算機所播放的聲音被採集,同時SDK內部會自動遮蔽其它使用者的聲音(如果不遮蔽,則使用者的聲音會被採集下來,並回傳給使用者,使用者那邊將會聽到迴音),SDK內部會自動關閉音訊特效處理,該模式通常應用於向其他使用者放歌,而不用關心其他使用者發言的場合;
    3、卡拉OK模式:自動選擇立體聲混音和麥克風兩個輸入源裝置(該特性與硬體相關,有些音效卡不支援同時採集麥克風和立體聲混音),本地計算機所播放的聲音和使用者說話的聲音將會被採集,同時SDK內部會自動遮蔽其它使用者的聲音,SDK內部會自動關閉音訊特效處理,該模式通常應用於向其他使用者放歌,同時自己用麥克風伴唱,而不用關心其它使用者發言的場合;
    4、線路輸入模式:自動選擇線路輸入源裝置,透過線路輸入的聲音將被採集(通常是指將外部的DVDVDTV等裝置的音訊輸出端子接入音效卡的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
、關鍵幀間隔是指在編碼的過程中,兩個關鍵幀之間非關鍵幀的數量,值越大,位元速率越小,但會降低影片的質量,值越小,位元速率越大,影片質量較好,但不宜過小,通常的建議是網際網路應用(幀率的34倍),區域網應用(等於幀率),不要小於幀率;

關於本地影片編碼的預設引數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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章