簡介

通常在VOIP通話應用場景中,兩個人互相進行實時通話,會涉及到很多的技術要點(更詳細內容請參考《音頻開發應該知道的VOIP通話技術基礎》),假設開發者已經對VOIP通話有基本的認識了,整體流程處理如圖1所示:

圖1

QttAudio?SDK解決了紅框部分——所有聲音相關的問題:

  • 采集\播放:QttAudio會控制(接管)系統的采集和播放;
  • 音頻前\后處理:包括AEC、AGC、NG、混音等聲音處理;
  • 音頻編解碼:支持opus,speex,pcm編解碼。

通過接入QttAudio,開發者不再需要關心回聲消除、增益、編解碼等相關知識,也不需要關心具體平臺的音頻API調用方式。QttAudio是多平臺統一接口,開發者只需通過QttAudio獲得干凈清晰的采集聲音數據,打包發送給對方,接收解包對方發過來的聲音數據,丟給QttAudio進行播放,就完成了整個通話過程。

所以,QttAudio有一個很重要的優勢——不捆綁云服務,這樣的好處是你可以將QttAudio深度集成進你的應用,并針對多種網絡環境靈活部署。

為了解決上圖紅框中的技術問題,我們設計了QttAudioEngine和QttAudioStream兩個類來實現:

  • QttAudioEngine

包含了QttAudio?SDK整體的初始化,音頻采集\播放,音頻信號處理(AEC,NS,AGC等),音頻編碼,以及混音等功能;

  • QttAudioStream

包含了音頻解碼、播放聲音增益調節,播放等功能。

關于這兩個類的更多使用說明,請詳細參考后面《QttAudio使用說明》。

假設開發者想開發一個VOIP 1對1的單人語音通話應用,已經有了自己的傳輸方式(或包含服務器),或者至少具備基本的UDP傳輸知識(如果不具有傳輸方面的知識,開發者也可以使用我們的物聯網P2P傳輸SDK,更方便快捷穩定,請聯系客服QQ或電話:18140105956),現在只需要QttAudio來處理所有聲音相關的工作。接下來,還需要了解一些基本術語。

術語

  • AEC:Acoustic Echo Cancellation,聲學回聲消除,這是音視頻社交中最有難度的技術,沒有之一。
  • AGC:自動增益控制(Automatic Gain Control)使放大電路的增益自動地隨信號強度而調整的自動控制方法。簡單理解,就是將通話過程中過大的聲音調小,過小的聲音調大,使整個通話過程的聲音平穩。
  • NS(NG):Noise Suppression(Noise Gate),降噪。常用于在音頻信號處于低電平時,壓制能聽到而又不想要的噪聲。你可以使用它來移除背景噪音、其他信號源的交擾以及低電平的雜音。Noise Gate 的工作原理是讓臨界值音量以上的信號不受阻礙地通過,同時減少低于臨界值音量的信號。這樣能有效移除信號的較低音量聲部,同時讓所需的音頻聲部通過。

理解 QttAudio

要使用QttAudio?SDK,系統采集或播放的API就不需要再使用了,因為QttAudio包含了音頻的采集和播放,進而形成輸入和輸出兩條通路的核心功能。圍繞這兩大核心,還有一些附加功能設置接口,比如:

針對采集/播放和編解碼部分:聲道數,采樣率,比特率的設置;

針對聲音的前后處理部分:有輸出、輸入聲音的增益(音量)調節, 降噪開關及其閾值調節的設置。

整體示意如圖2和表1所示。

圖2

Java?API 備注
核心使用接口 QttAudioEngine 設置的onCapture()?mic采集回調 采集輸出接口,QttAudioEngine開始工作后,回調函數就有數據源源不斷出來
QttAudioStream?playBuffer() 播放輸入接口,QttAudioStream對象開始工作后調用
編解碼設置接口 QttAudioEngine setMicCodecParams() 設置采集編碼參數
QttAudioStream?setCodecParams() 設置播放解碼參數
聲音信號處理接口 QttAudioEngine setAecLevel() 設置AEC算法等級,默認1
QttAudioEngine enableNoiseGate() 開啟關閉降噪接口
QttAudioEngine setNoiseGateThres() 設置降噪閾值,可以在實時通話過程中調節
聲音增益調節接口 QttAudioEngine setMicGain() 設置mic采集音量大小,可以在實時通話過程中調節
QttAudioStream?setOutputVolume() 設置stream播放音量大小,可以在實時通話過程中調節
工作狀態改變接口 QttAudioEngine\QttAudioStream?start() 開啟采集或播放
QttAudioEngine\QttAudioStream?stop() 關閉采集或播放
初始化\釋放接口 QttAudioEngine init() 初始化整個QttAudio?SDK
QttAudioEngine free() 釋放整個QttAudio?SDK
QttAudioEngine createStream() 初始化一個QttAudioStream對象
QttAudioStream?free() 釋放QttAudioStream對象

表1

準備工作

我們以Android平臺,介紹QttAudio?SDK環境配置的工作。其他平臺是C語言接口,都提供一個庫文件和頭文件。

?1. ?導入 SDK

圖3

 

?2. ?編輯權限

圖4

注:Android?6.0系統以上,需要代碼動態申請紅框中的權限,此處省略。

代碼示例

本章節將通過實際代碼片段和SingleCall工程(下載鏈接),介紹QttAudio的基本生命周期,掌握QttAudio?API的調用時機,以及網絡收發時的線程運行模型。

?1. ?整體及采集設置

?1.1? 初始化QttAudioEngine
//初始化QttAudio SDK,appkey在登錄官網(鏈接)后臺控制臺可申請
QttAudioEngine.me().init(context, "your appkey");
?
1.2? 設置QttAudioEngine
  • 設置noisegate降噪開關
  • 設置mic采集編碼參數
  • 設置mic采集回調函數

通過設置該回調函數,開發者可源源不斷獲得mic采集的,并經過aec、ns等??櫬砉蟾刪壞納?,開發者只需將該數據進行打包發送給對方即可。

//打開降噪,默認是打開的
//QttAudioEngine.me().enableNoiseGate(true);

//設置mic采集的編碼參數,該參數影響mic采集回調的數據類型
QttAudioEngine.me().setMicCodecParams("opus", 1, 16000, 32000);

//設置mic的采集回調函數
QttAudioEngine.me().setMicCaptureCb(new QttCaptureCallbak() {
    @Override
    public void onCapture(byte[] buffer, int length, Object userdata) {
        //使用udp發送給對方
        udpUtil.send(buffer, length, "對方IP", destPort);
    }
}, null);
?
1.3? 開啟工作,進行采集
QttAudioEngine.me().start();
?

?2. ?播放設置

?2.1?創建QttAudioStream
?2.2 設置QttAudioStream
  • 設置播放解碼參數
//使用QttAudioEngine創建QttAudioStream對象
QttAudioStream stream = QttAudioEngine.me().createStream();
if (stream != null) {
    //設置stream的解碼播放參數,需要與對端傳過來的編碼參數一致方可正確播放,否則有可能放出的是吱吱聲音
stream.setCodecParams("opus", 1, 16000, 32000);
}

 

2.3 開啟工作,進行播放

開發者需在另一個線程中不斷進行接收對端發過來的數據并進行解包,在該QttAudioStream對象工作后,調用該QttAudioStream對象的playBuffer進行播放。

stream.start();

?3. ?參數設置

以下設置方法在engine或者stream start方法后可調用,其余設置方法均需在start方法前調用。

//將聲音輸出到揚聲器上
QttAudioEngine.me().routeAudioTo(QttAudioOutput.SPEAKER);
//調節mic采集音量,默認為1.0f
QttAudioEngine.me().setMicGain(1.1f);

//調節降噪閾值,默認為0.05f,閾值越大過濾的噪音音量越大,太大了則會影響過濾掉正常通話的采集聲音,不太建議大于0.2f
QttAudioEngine.me().setNoiseGateThres(0.1f);

//調節stream播放音量
stream.setOutputVolume(1.1f);

?4. ?退出部分

QttAudio?API設計時,生命周期的改變方法上,init()與free()方法對應,start()與stop()方法對應。

?4.1? 停止
//停止音頻播放,與stream.start()方法對應
stream.stop();
//停止音頻采集,與QttAudioEngine.me().start()方法對應
QttAudioEngine.me().stop();
?
4.2? 釋放
//釋放stream,當不再需要該stream時,調用free()方法,與QttAudioEngine的createStream()方法對應
stream.free();

//釋放SDK,在程序完全退出時或者不再需要QttAudio時調用
QttAudioEngine.me().free();

?5. ?網絡收發調用模型

我們實現一個UdpUtil類,簡單演示UDP裸數據包進行收發,該類的健壯性、多線程操作等方面沒有完備考慮,請開發者注意。

public class UdpUtil {
    /**
     * udp接收線程的回調接口
     */
    public interface UdpRecvCallback {
        void onRecv(byte[] buffer, int offset, int length);
    }

    private static final int MTU = 1400;
    private DatagramSocket socket = null;
    private UdpRecvCallback callback = null;
    private boolean isRunning = false;

    /**
     * 設置udp接收線程的回調接口
     * @param callback
     */
    public void setRecvCallback(UdpRecvCallback callback) {
        this.callback = callback;
    }

    /**
     * udp開始工作
     * @param localPort udp監聽的本地端口
     * @throws SocketException
     */
    public void start(int localPort) throws SocketException {
        stop();
        socket = new DatagramSocket(localPort);
        socket.setSoTimeout(20);
        isRunning = true;
        new Thread(new Runnable() {
            @Override
            public void run() {
                byte[] buffer = new byte[MTU];
                DatagramPacket recvPacket = new DatagramPacket(buffer, 0, MTU);
                while (isRunning) {
                    try {
                        socket.receive(recvPacket);
                        callback.onRecv(recvPacket.getData(), 0, recvPacket.getLength());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

    /**
     * 發送數據給對方(IP+Port)
     * @param buffer
     * @param length
     * @param destIp
     * @param destPort
     */
    public void send(byte[] buffer, int length, String destIp, int destPort) {
        if (socket != null) {
            try {
                DatagramPacket sendPacket = new DatagramPacket(buffer, 0, length,
                        InetAddress.getByName(destIp), destPort);
                socket.send(sendPacket);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * udp停止工作
     */
    public void stop() {
        isRunning = false;
        if (socket != null) {
            socket.close();
            socket = null;
        }
    }
}

 

當接收到udp數據包后,直接調用QttAudioStream的playBuffer方法播放即可,如圖6調用所示:

圖6

UDP的發送方法,則在QttAudioEngine的mic采集回調里就被調用了,如圖7所示。

圖7

QttAudio 使用說明

1. ?生命周期

圖8

如圖8所示,有幾點需要開發者注意:

  • 生命周期對應關系

顏色一致的相互對應。比如開發者在程序啟動時調用了engine的init方法,則在程序退出時需調用engine的free方法;比如調用了engine的start方法,則一定需要在某個時刻調用engine的stop方法。

  • 生命周期調用順序

從上到下的順序關系:總體首先需要engine?init后,方可調用engine或者stream的相關方法。結束或者需要釋放所有資源時,調用engine?free方法,則會將所有創建和啟動的資源全部停止及釋放。

平級代表相互之間沒關系:比如engine和stream、以及stream對象之間,相互生命周期沒有影響,各自管各自的。

2. ?采集/播放、混音

代碼示例里介紹了單人1對1通話時,engine?start后可以從engine設置的回調函數得到mic采集的音頻數據,發送給對方;建一個stream對象并start后,接收對方mic采集的數據,交給stream播放。

如果不調用engine start方法,除了engine采集回調沒有數據,而假設stream依舊在持續playbuffer,這時會放出聲音嗎?答案是不會。

如果此時不是1對1,而是5個人在同時說話呢,還能用一個stream對象進行播放嗎?答案是不能。

以上兩個問題比較關鍵,涉及圖9中要表達的幾個關鍵知識點。當理解了圖9所示的內容,則多人語音會議通話,或者手機KTV,音軌合成等應用場景都可以使用QttAudio?SDK輕松開發出來!

圖9

 

  • 采集/播放完全與engine關聯,或者說engine包含了設備的聲卡硬件驅動。
  • stream只是混音,如果engine沒有start,則stream的操作或者寫入操作與聲卡無關。engine即使start了,也可設置engine的QttLinkMode,將stream與聲卡進行解耦或關聯。

比如將QttLinkMode設置為SOUND_CARD_NOTHING,則stream的輸入輸出操作與聲卡無關。

stream技術上用于多音軌、多音頻文件的混音合成操作,適用于多人語聊會議室,手機ktv,音頻文件合成、混音等應用場景,這一切只需使用多個stream對象即可辦到!1對1的單人語音通話,只是多人語音通話的一個特殊情況而言。

  • stream對象的輸入自不必說,開發者需要混音什么數據就向stream輸入什么數據。stream對象的輸出,其形式與engine的mic采集回調是同樣的,其內容則是其他stream對象和mic(如果有)的混音數據。如果不需要stream的輸出內容,則不必設置stream的回調函數,以減少該stream混音及編碼的性能消耗。

多人語音通話實現則很簡單了:在一個語音房間內,將mic的采集數據發送給其他人;除自己外有幾個人,就使用幾個stream對象,并且與之對應,接收那個人發過來的mic數據,交給對應的stream播放即可。具體可參考我們demo。

3. ?采集回調注意事項

以Java?API為例,采集回調出來的數據長度是參數length,而不是buffer.length,offset偏移量是0。

QttAudioEngine.me().setMicCaptureCb(new QttCaptureCallbak() {
    @Override
    public void onCapture(byte[] buffer, int length, Object userdata) {
    }
}, null);

 

另外該回調函數體內,請將buffer[0-length]深拷貝出去使用,并且不要有阻塞或者耗時方法。

4. ?寫入操作注意事項

以Java?API為例,QttAudioStream的playBuffer方法,buffer長度不可超過4096,超過會崩潰。當然最好是10ms音頻數據的量

5. ?AEC 等級的使用

QttAudio內置了兩種AEC算法等級:1和2,默認使用的是AEC等級1。當遇到特殊設備,或者覺得等級1效果不好時,可以在QttAudio?SDK初始化后,QttAudioEngine和QttAudioStream?start()方法前進行設置。

QttAudioEngine.me().setAecLevel(2);

 

6. ?降噪參數的調節

如果開發者初始化參數時將降噪關閉,則可在實時通話時,調節降噪參數。降噪參數會影響mic采集的聲音,它會過濾掉外界環境噪音,當然太大了也會過濾掉人說話的聲音。默認是0.05f,一般不建議大于0.2f。如果開發者體驗效果好,則不需要關心這個設置參數。

7. ?增益的調節

如果實際通話中,或者某些設備通話體驗中,感覺對方說話聲音太小或太大,或者對方覺得自己聲音太小或太大,都可以通過QttAudio提供的API來調節采集或播放的聲音增益。該音量與系統的音量無關。QttAudioEngine有設置mic的增益方法,QttAudioStream有設置輸入和輸出的音量方法。

API參考

1. ?Android

QttAudioEngine概覽

方法 描述
me 單例模式,返回QttAudioEngine對象
init 初始化函數,整個程序期間只調用一次?;嵊兇樅?,建議不要在主線程執行
free 釋放QttAudioEngine單例對象,在程序退出時調用該方法。與init方法相對應。
start 開啟mic采集
stop 停止mic采集
setMicCodecParams 設置mic采集編碼的格式
setMicCaptureCb 設置語音mic采集回調
setSilenceDetectCb mic靜音檢測回調
createStream 創建QttAudioStream音頻流
enableNoiseGate 開啟/關閉降噪功能
setNoiseGateThres 設置降噪閾值
setMicGain 設置mic增益
enableSpeaker 開啟/關閉揚聲器
routeAudioTo 設置音頻播放路由
setAecLevel 設置AEC等級
isSpeakerOn 是否啟用揚聲器
startRecord 開始錄音
stopRecord 停止錄音
setCapturePcmBufSize 設置mic回調中返回的語音數據buffer大小
setRemoteAddr 設置遠端地址
muteNetSend 暫停/恢復發送
setEchoDelay 設置回聲消除時延
detectEcho 如果某些機型有回聲,在初始化后調用該函數一次并運行一次即可,以后無需再調用
noiseSuppressionFile PCM文件降噪處理
enableAudioCompatibilityMode 如果某些機型有回聲,在初始化后調用該函數一次并運行一次即可,以后無需再調用

 

QttAudioStream概覽

方法 描述
構造方法 不可調用,只能由QttAudioEngine.me().createStream()方式生成該語音流對象
free 和構造方法對應,釋放該語音流對象
start 啟動該語音流對象,開始工作
stop 停止語音流,與start方法對應
setCodecParams 設置編解碼的格式
playBuffer 播放音頻buffer,聽筒或者揚聲器就會放出聲音來
setOutputVolume 設置該語音流輸出播放音量,影響的是揚聲器或聽筒的播放音量
mute 靜音該語音流對象
setSilenceDetectCb 設置語音流靜音檢測
setCaptureCb 設置語音流的mic采集及混音回調函數
setAsFileInput 設置文件播放路徑(WAV)
pauseFile 暫停文件播放
resumeFile 恢復文件播放
seekFile 快進/快退
setRtpParams 設置RTP網絡收發參數,使語音流對象采用RTP方式傳輸音頻
setAsNetInput 設置輸入為網絡接收
setAsNetOutput 將流輸出的內容作為網絡傳送輸出

 

QttCaptureCallbak概覽

onCapture 音頻流的數據采集編碼回調

 

QttEventCallback概覽

onEventNotify 事件通知回調

 

詳細描述

1.1 QttAudioEngine

/**
* 單例模式,返回QttAudioEngine對象
* @return QttAudioEngine單例對象
*/

public synchronized static QttAudioEngine me()?

/**
* 初始化函數,整個程序期間只調用一次?;嵊兇樅?,建議不要在主線程執行
* @param context
* @param appKey
* @throws QttException 初始化失敗則會拋出該異常
*/

public void init(Context context, String appKey) throws QttException

/**
* 釋放QttAudioEngine單例對象,在程序退出時調用該方法。與init方法相對應。
*/

public void free()

/**
* 啟動QttAudioEngine對象,開始采集音頻
* @return 0為啟動成功,其他為失敗
*/

public int start()

/**
* 停止音頻采集,與start方法對應
*/

public void stop()

/**
* 設置mic采集編碼的格式
* @param mime "pcm", "opus", "speex"三者之一
* @param channel 1,只支持單聲道
* @param samplerate 采樣率,8000,16000,32000,44100,48000
* @param bitrate 比特率,當mine設定為"pcm"時,該值無意義,用戶傳入0即可
*/

public void setMicCodecParams(String mime, int channel,? int samplerate, int bitrate)

/**
* 設置語音mic采集回調函數,通過設置該回調,開發者可以獲得mic采集編碼后的音頻數據
* 該接口與QttAudioStream的setPayloadCallback不同之處在于,該接口只獲取mic采集的聲音
* @param micCallback?mic采集回調
* @param?userdata 用戶傳進來的對象
*/

public void setMicCaptureCb(QttCaptureCallbak micCallback, Object userdata)

/**
* 設置靜音檢測回調
* @param eventCallback?檢測結果回調,回調返回1為開始說話,0為停止說話
* @param?userdata 用戶傳進來的對象
*/

public void setSilenceDetectCb(QttEventCallback eventCallback, Object userdata)

/**
* 創建QttAudioStream音頻流對象
* @return QttAudioStream
*/

public QttAudioStream createStream()

/**
* 是否啟用通話降噪功能
* @param on true為啟用,false為不啟用
*/

public void enableNoiseGate(boolean on)

/**
* 設置通話降噪的閾值,默認為0.05f
* @param val val值越大,降噪越厲害,對于正常說話聲音音量要求也更大
*/

public void setNoiseGateThres(float val)

/**
* 設置mic采集的增益大小,默認為1
* @param vol 0至3的范圍,當vol為1時是原聲大小,為0是完全靜音
*/

public void setMicGain(float vol)

/**
* 開關揚聲器方法,默認為false
* @param on true: 打開揚聲器; false: 關閉揚聲器,使用聽筒
*/

public void enableSpeaker(boolean on)

/**
* 設置音頻播放路由
* @param output?HEADPHONE/SPEAKER/BLUETOOTH?聽筒/揚聲器/藍牙
*/

public void routeAudioTo(QttAudioOutput output)

/**
*?設置AEC等級,默認為1
* @param level?1或者2,一般大部分安卓設備1就夠了;針對1效果不好的情況,使用2,2有可能會造* 成丟音等情況,以實際設備測試情況為準
*/

public void setAecLevel(int level)

/**
*?是否打開揚聲器
* @return true: 揚聲器為打開狀態; false: 揚聲器為關閉狀態
*/

public boolean isSpeakerOn()

/**
*?開始錄音
* @param wavFile wav文件名及路徑
*/

public void startRecord(String wavFile)

/**
*?停止錄音
*/

public void stopRecord()

/**
*?設置MIC回調中返回的語音數據buffer大小
* @param size?如320/640等,默認320,一般不需要修改該參數
*/

public void setCapturePcmBufSize(int size)

/**
*?當調用該接口后,會直接通過內部傳輸協議(udp),將mic的采集數據發送給遠端IP和端口
* @param?remoteIp?遠端IP
* @param?remotePort 遠端端口
*/

public void setRemoteAddr(String remoteIp, int remotePort)

/**
*?暫停/恢復發送
* @param?mute true暫停;false恢復
*/

public void muteNetSend(boolean mute)

/**
* 設置回聲消除時延
* @param delay
*/

public synchronized void setEchoDelay(int delay)

/**
* PCM文件降噪處理接口
* @param inFile ????待處理的PCM文件路徑,建議采樣率不大于16000
* @param outFile ???降噪后輸出的PCM文件路徑
* @param samplerate 采樣率
* @param mode ??????0,1,2,數字越大,降噪算法越激進
* @return 0成功, 其他失敗
*/

public int noiseSuppressionFile(String inFile, String outFile, int samplerate, int mode)

/**
* 如果某些機型有回聲,在初始化后調用該函數一次并運行一次即可,以后無需再調用
*/

public synchronized void detectEcho()

/**
* 如果某些特殊機型無法運行,則在init方法調用成功后,調用該函數設置為兼容模式,并傳入參數true。
* 該函數一般不需要調用
* @param val true為啟用兼容模式;false為不啟用兼容模式。
*/

public void enableAudioCompatibilityMode(boolean val)

1.2 QttAudioStream

/**
* 構造方法,調用QttAudioEngine對象的createStream( ) 創建QttAudioStream對象
* 創建QttAudioStream音頻流對象
* @return QttAudioStream
*/

public QttAudioStream createStream()

/**
* 釋放語音流,與構造函數或者說QTTAudioEngine.me().createStream()對應
*/

public void free()

/**
* 啟動QttAudioStream對象,開始工作
* @return 0為啟動成功,其他為失敗
*/

public int start()

/**
* 停止語音流,與start方法對應
*/

public void stop()

/**
* 設置QttAudioStream對象的編解碼的格式,必須和setMicCodecParams傳入參數一致,否則會導致通話不正常
* @param mime "pcm", "opus", "speex"三者之一
* @param channel 1,只支持單聲道
* @param samplerate 采樣率,8000,16000,32000,44100,48000
* @param bitrate 比特率,當mine設定為"pcm"時,該值無意義,用戶傳入0即可
*/

public void setCodecParams(String mime, int channel,? int samplerate, int bitrate)

/**
* 播放音頻buf,聽筒或者揚聲器就會放出聲音來
* @param buffer 音頻buffer
* @param offset buffer偏移量,沒有偏移量就是0
* @param length buffer長度
*/

public void playBuffer(byte[] buffer, int offset, int length)

/**
* 設置語音流輸出播放音量,影響的是揚聲器或聽筒的播放音量
* @param vol 正常范圍是0-1,1為原音量,可大于1
*/

public void setOutputVolume(float vol)

/**
* 靜音該QttAudioStream對象
* @param isMute true為靜音,false為不靜音
*/

public void mute(boolean isMute)

/**
* 設置靜音檢測回調
* @param eventCallback?檢測結果回調,回調返回1為開始說話,0為停止說話
* @param?userdata 用戶傳進來的對象
*/

public void setSilenceDetectCb(QttEventCallback eventCallback, Object userdata)

/**
* 設置語音流的mic采集及混音回調函數,通過設置該回調,開發者可以源源不斷獲得mic采集的混音音頻數據
* 該接口與QttAudioEngine的setPayloadCallback不同之處在于,當有多個stream時,該接口獲得的是其他stream播
* 放的聲音與mic采集的聲音的混音后的音頻數據,具體數據內容可參見文檔x.x節
* @param streamCaptureCB 音頻采集回調接口
* @param userdata 用戶傳進來的對象
*/

public void setCaptureCb(QttCaptureCallbak streamCaptureCB, Object userdata)

/**
* 設置為文件播放
* @param wavFile 文件播放路徑
*/

public void setAsFileInput(String wavFile, QttEventCallback onFileEOF, Object filedata)

/**
* 暫停文件播放
*/

public void pauseFile()

/**
* 恢復文件播放
*/

public void resumeFile()

/**
* 跳轉到absSecs秒后開始播放
* @param absSecs 秒
*/

public void seekFile(int absSecs)

/**
* 設置RTP網絡收發參數,使QttAudioStream對象采用RTP方式傳輸音頻
* @param localRtpPort?? 本地rtp端口
* @param localRtcpPort? 本地rtcp端口
* @param remoteIP?????? 遠程目的ip
* @param remoteRtpPort? 遠程目的rtp端口
* @param remoteRtcpPort 遠程目的rtcp端口
* @param mode?????????? 1是只接收模式,2是發送&接收模式
* @param idx??????????? 設置rtp的載荷類型,通話雙方必須要一樣
* @param ssrc?????????? 設置rtp的ssrc,該字段一般用來區分rtp流
*/

public void setRtpParams(int localRtpPort, int localRtcpPort, String remoteIP, int remoteRtpPort, int remoteRtcpPort, int mode, int ssrc, int idx)

/**
* 以網絡接收為輸入
* @param localPort 本地端口
*/

public void setAsNetInput(int localPort)

/**
* 將流輸出的內容作為網絡傳送輸出,不需要就不調用
* @param destIp 遠端IP
* @param destPort 遠端端口
*/

public void setAsNetOutput(String destIp, int destPort)

1.3 QttCaptureCallbak


/**
* 音頻采集編碼的回調函數
* @param buffer ???采集編碼的內容
* @param length ???buffer的長度是length,而不是buffer.length
* @param userdata ?userdata
*/

void onCapture(byte[] buffer, int length, Object userdata);

1.4 QttEventCallback


/**
* 事件通知回調
* @param event 結果
* @param userdata 用戶傳進來的對象
*/

void onEventNotify(int event, Object userdata);

聯系我們

1.? ?聯系郵箱

[email protected]

2.? ?客服QQ

3293059790

3.? ?咨詢電話

028-62486620

18140105956