首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pjsua2在调用中播放wav

使用pjsua2在调用中播放wav
EN

Stack Overflow用户
提问于 2021-04-14 18:34:58
回答 1查看 854关注 0票数 0

我试图在PJSUA 2.11调用中播放16位PCM .wav文件(也发生在2.10中)。日志没有显示任何错误,但是我在另一边没有听到任何声音。我已经禁用了系统音频设备,以防止使用系统音频,但它也没有工作的一个启用。

我有过

endpoint

  • ep.audDevManager().setNullDev();

  • created

  • 创建了一个transport

  • ep.libStart();

  • created,一个带有credentials

  • created的帐户,一个新的调用,使用了一个继承的类,使用CallOpParam prm(true);

  • while (call->isActive()) pj_thread_sleep(1000);

的默认参数

在我的呼叫课上,我试着像这样播放音频:

代码语言:javascript
复制
    virtual void onCallMediaState(OnCallMediaStateParam &prm)
    {
        std::cerr << "received media state" << std::endl;
        CallInfo ci = getInfo();

        for (unsigned i = 0; i < ci.media.size(); i++) {
            if (ci.media[i].type == PJMEDIA_TYPE_AUDIO
                && (ci.media[i].dir == PJMEDIA_DIR_ENCODING || ci.media[i].dir == PJMEDIA_DIR_ENCODING_DECODING)
                && ci.media[i].status == PJSUA_CALL_MEDIA_ACTIVE
            ) {
                AudioMedia aud_med = getAudioMedia(i);
                AudioMediaPlayer* player = new AudioMediaPlayer();
                player->createPlayer("wav/audio.wav");
                player->startTransmit(aud_med);
                break;
            }
        }
    }

我尝试了几种不同的回放尝试:除此之外,我尝试在第一媒体之后不中断,或者使用AudioMediaPlayer作为只初始化一次的类成员。

然而,在偏僻的一边,我从来没有听到过任何声音。我已经证实,这些设备在系统上确实可以闪烁工作,并且呼叫确实连接。

日志(在接受呼叫后):

代码语言:javascript
复制
20:27:25.506      inv0x55d724e01988  ....SDP negotiation done: Success
20:27:25.506          pjsua_media.c  .....Call 0: updating media..
20:27:25.506          pjsua_media.c  ......Call 0: stream #0 (audio) unchanged.
20:27:25.506          pjsua_media.c  ......Audio updated, stream #0: G722 (sendrecv)
received media state
20:27:25.506            pjsua_aud.c  .....Creating file player: wav/audio.wav..
20:27:25.506           wav_player.c  ......File player 'wav/audio.wav' created: samp.rate=44100, ch=1, bufsize=4KB, filesize=178KB
20:27:25.506            pjsua_aud.c  ......Player created, id=2, slot=4
20:27:25.506            pjsua_aud.c  .....Conf connect: 4 --> 1
20:27:25.506           conference.c  ......Port 4 (wav/audio.wav) transmitting to port 1 (sip:<remote number>@192.168.178.1)

我在想,这可能与我根本不使用远程接收到的音频有关,但我不知道如何不用它而丢弃它。音频文件使用pjsip附带的播放文件示例在本地PC上播放。

EN

回答 1

Stack Overflow用户

发布于 2021-05-26 14:02:52

我的代码可以回放wav。您可能会错过一个aud_med.start_transmit:

代码语言:javascript
复制
void MyCall::onCallMediaState(pj::OnCallMediaStateParam &prm)
{
    try {
        auto callInfo = getInfo();
        std::cout << "*** onCallMediaState state: id=" << callInfo.id << ", state="  << callInfo.stateText << std::endl;
        PJ_UNUSED_ARG(prm);

        pj::AudioMedia& play_dev_med =
            pj::Endpoint::instance().audDevManager().getPlaybackDevMedia();
        

        // Get the first audio media
        pj::AudioMedia aud_med = getAudioMedia(-1);

        if (!player_) {
            player_ = std::make_unique<pj::AudioMediaPlayer>();
            player_->createPlayer("/home/Projects/test.wav");
        }

        player_->startTransmit(aud_med);
        // And this will connect the call audio media to the sound device/speaker
        aud_med.startTransmit(play_dev_med);
   }
   catch (const pj::Error& e) {
        std::cerr << "***Exception: " << e.info() << std::endl;
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67097288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档