簡體   English   中英

ios pjsip-在通話中播放聲音

[英]ios pjsip - play a sound during sip call

在飲時,有時我想發送dtmf數字。
為此,我創建了一個自定義撥號盤,當按下某個鍵時,該撥號盤應播放該鍵的聲音,但在Sip通話期間不會播放該聲音(沒有通話時,會播放聲音)。
這些聲音是使用AudioToolbox.h庫( AudioServicesPlaySystemSound(soundID) )中的函數播放的。

我需要在pjsip(pjsua)或AudioToolbox庫中設置一些屬性,以便在sip通話期間播放聲音嗎?
我知道這是可能的( Bria也有, Groundwire也有,不確定他們是否正在使用pjsip來實現sip)。

該答案是來自以下兩個鏈接的代碼片段的組合: PJSUA-API Media ManipulationpjsipDll_PlayWav.cpp

當pjsua撥打電話時,它使用端口(會議端口)將呼叫目的地的媒體傳輸到設備揚聲器。 您可以同時打開多個端口

因此,要播放鍵盤按鈕的點擊聲音,我們要做的是再打開一個端口並播放聲音(在這種情況下,它是一個wav文件,並且您會注意到,還有一個pjsua函數可用於傳輸avi文件) 。
為此,我們將使用以下功能:

 pj_status_t    pjsua_conf_connect (pjsua_conf_port_id source, pjsua_conf_port_id sink)

我們的接收器端口是設備揚聲器端口,在這種情況下(大多數情況下)為0。

以下所有功能均添加到pjsua_app.c文件中。 在Objective-C類中使用它們的地方之前,您必須添加以下行:

pj_status_t play_sound_during_call(pj_str_t sound_file);

在這里播放聲音的功能是:

pj_status_t play_sound_during_call(pj_str_t sound_file)
{
    pjsua_player_id player_id;
    pj_status_t status;
    status = pjsua_player_create(&sound_file, 0, &player_id);
    if (status != PJ_SUCCESS)
        return status;

    pjmedia_port *player_media_port;

    status = pjsua_player_get_port(player_id, &player_media_port);
    if (status != PJ_SUCCESS)
    {
        return status;
    }

    pj_pool_t *pool = pjsua_pool_create("my_eof_data", 512, 512);
    struct pjsua_player_eof_data *eof_data = PJ_POOL_ZALLOC_T(pool, struct pjsua_player_eof_data);
    eof_data->pool = pool;
    eof_data->player_id = player_id;

    pjmedia_wav_player_set_eof_cb(player_media_port, eof_data, &on_pjsua_wav_file_end_callback);

    status = pjsua_conf_connect(pjsua_player_get_conf_port(player_id), 0);

    if (status != PJ_SUCCESS)
    {
        return status;
    }        

    return status;
}

以下是回調函數,可在您的wav文件讀取(播放)結束時偵聽:

struct pjsua_player_eof_data
{
    pj_pool_t          *pool;
    pjsua_player_id player_id;
};

static PJ_DEF(pj_status_t) on_pjsua_wav_file_end_callback(pjmedia_port* media_port, void* args)
{
    pj_status_t status;

    struct pjsua_player_eof_data *eof_data = (struct pjsua_player_eof_data *)args;

    status = pjsua_player_destroy(eof_data->player_id);

    PJ_LOG(3,(THIS_FILE, "End of Wav File, media_port: %d", media_port));

    if (status == PJ_SUCCESS)
    {
        return -1;// Here it is important to return a value other than PJ_SUCCESS
                  //Check link below
    }

    return PJ_SUCCESS;
}

pjmedia_wav_player_set_eof_cb回調函數應返回除PJ_SUCCESS以外的值的原因是因為此處pjmedia_wav_player_set_eof_cb的文檔說:

請注意,如果應用程序破壞了回調中的文件端口,則它必須在此處返回non-PJ_SUCCESS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM