代码之家  ›  专栏  ›  技术社区  ›  WebFreak001 Ryan

使用pjsua2在通话中播放wav

  •  0
  • WebFreak001 Ryan  · 技术社区  · 4 年前

    我试图在PJSUA 2.11的通话中播放16位PCM单声道.wav文件(2.10也发生过这种情况)。日志没有显示任何错误,但我没有听到另一边的任何消息。我已禁用系统音频设备以防止使用系统音频,但启用系统音频时也无法使用。

    我有

    • 创建了一个端点
    • ep.audDevManager().setNullDev();
    • 创建了一个运输工具
    • ep.libStart();
    • 创建了一个具有凭据的帐户
    • 使用带有默认参数的继承类创建了一个新调用 CallOpParam prm(true);
    • while (call->isActive()) pj_thread_sleep(1000);

    在我的通话课上,我试图播放这样的音频:

        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作为类成员。

    然而,我从未在远处听到任何声音。我已经验证了这些设备在系统上确实可以闪烁,并且呼叫确实可以连接。

    log(接听电话后):

    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上播放。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Wijnand Velzel    4 年前

    我的代码确实可以播放wav。您可能会错过aud_med.start_transmit:

    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;
       }
    }
    
    推荐文章