天天看點

音視訊的開發工作

在即時通訊應用中,根據應用場景的不同,需要對音頻輸入源進行選擇,不同的應用場景對應不同的音頻工作模式。需要支援多種音頻工作(采集)模式,包括:

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));

典型的設定“品質因子模式”參數代碼如下:

03.dwValue = 0;

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)的值,視訊碼率參數根據需要進行設定。低碼率,配置較低的視訊品質,高碼率就需要配置較高的視訊品質。

本文轉自 fanxiaojun 51CTO部落格,原文連結:http://blog.51cto.com/2343338/512396,如需轉載請自行聯系原作者