Pjsip iOS如何将声音传输到接收方并进行记录?

问题描述 投票:2回答:1
func startSipRecording(caller: String, callid: pjsua_call_id) -> (started: Bool, startDate: NSDate?) {
        var status = pj_init()
        if status != PJ_SUCCESS.rawValue {
            return (false, nil)
        }
        cpFec = pjsua_data().cp
        /* Must create a pool factory before we can allocate any memory. */
        pj_caching_pool_init(&cpFec!, &pj_pool_factory_default_policy, 0)
        status = pjmedia_endpt_create(&cpFec!.factory, nil, 1, &med_endpt
        )
        if status != PJ_SUCCESS.rawValue {
            return (false, nil)
        }
        pool = pj_pool_create(&cpFec!.factory, "app", 4000, 4000, nil)
        status = pjmedia_conf_create( pool,        /* pool to use        */
            3,/* number of ports        */
            CLOCK_RATE,
            NCHANNELS,
            SAMPLES_PER_FRAME,
            BITS_PER_SAMPLE,
            0,        /* options            */
            &medconf        /* result            */
        );
        if status != PJ_SUCCESS.rawValue {
            return (false, nil)
        }
        pj_pool_alloc(pool, 3 * MemoryLayout.size(ofValue: (pjmedia_port).self))
        print("Starting recording...")
        let rec = Recording.getNewSipBlanckRecording(callerName: caller)
        let files = FileProvider.getRecordingUrl(fileName: rec.fileName)?.path
        let fileName: pj_str_t = pj_str(convertToChar(files))
        print(status == 0 ? "REecorder has been created." : "\(files ?? "")")
        UserDefaults.standard.set(recorder_id, forKey: current_recorder_id)
        UserDefaults.standard.synchronize()
        /* Create WAVE file writer port. */
        let str = String(cString: fileName.ptr, encoding: .utf8)
        status = pjmedia_wav_writer_port_create(pool,
                                                str,
                                                CLOCK_RATE,
                                                NCHANNELS,
                                                SAMPLES_PER_FRAME,
                                                BITS_PER_SAMPLE,
                                                0, 0,
                                                &file_port)
        /* Create sound player port. */
    //    status = pjmedia_snd_port_create_rec(pool,       /* pool         */
    //        -1,         /* use default dev.        */
    //        PJMEDIA_PIA_SRATE(&file_port!.pointee.info),/* clock rate.     */
    //        PJMEDIA_PIA_CCNT(&file_port!.pointee.info),/* # of channels.       */
    //        PJMEDIA_PIA_SPF(&file_port!.pointee.info), /* samples per frame.   */
    //        PJMEDIA_PIA_BITS(&file_port!.pointee.info),/* bits per sample.     */
    //        0,      /* options      */
    //        &snd_port       /* returned port       */
    //    )

        if status != PJ_SUCCESS.rawValue {
            return (false, nil)
        }
        var strName = pj_str_t(ptr: convertToChar("recorderName"), slen: 12)
        status = pjmedia_conf_add_port(medconf, pool, file_port, &strName, &recSolt)
    //    status = pjmedia_snd_port_connect(snd_port, file_port)
        var ci = pjsua_call_info()
        pjsua_call_get_info(callid, &ci)
        var recordPort = pjmedia_conf_port_info()
        pjmedia_conf_get_port_info(medconf, recSolt, &recordPort)

        pjmedia_conf_connect_port(medconf, 0, recordPort.slot, 0)
        guard ci.conf_slot != -1 else { return (false, nil) }
        let portid = pjsua_call_get_conf_port(callid)
        pjmedia_conf_connect_port(medconf, UInt32(portid), recordPort.slot, 0)
    //
        pjsua_conf_connect(portid, pjsua_conf_port_id(recordPort.slot))
        pjsua_conf_connect(0, pjsua_conf_port_id(recordPort.slot))
    //
        pjmedia_conf_adjust_rx_level(medconf, recordPort.slot, 128)
        pjmedia_conf_adjust_tx_level(medconf, recordPort.slot, 128)
        pj_thread_sleep(1000)
        return (true, rec.startDateTime)
    }
    /*
        Stop recording variables saved and destroy sound port, media endpoint and release pool
     */
    func stopSipRecordingandBeep(isBeep: Bool) -> Bool {
        var status:pj_status_t = 1
        if let medEndPoint = medconf {
            pjmedia_conf_destroy(medEndPoint)
        }
    //    if let sndport = snd_port {
    //        status = pjmedia_snd_port_destroy(sndport)
    //    }
        if let fileport = file_port {
            status = pjmedia_port_destroy(fileport)
        }
        if isBeep {
    //        if let sndport = snd_port_Player {
    //            status = pjmedia_snd_port_destroy(sndport)
    //        }
            if let fileport = file_port_Player {
                status = pjmedia_port_destroy(fileport)
            }
        }
        if let poolobj = pool {
            pj_pool_release(poolobj)
        }
        if let medEndPoint = med_endpt {
            pjmedia_endpt_destroy(medEndPoint)
        }
        if cpFec!.used_size > 0 {
            pj_caching_pool_destroy(&cpFec!)
        }
        pj_shutdown()
        return status == 0 ? true : true
    }
    // MARK :- Play Beep Sound
    /*
     - Create player which will return player id
     - Save Player port
     - Create pool and set EOF of file callback
     - Connect player to sound port
     - Connect player to call reciever's port
     - Connect player to recording port
     */
    //Play audio file in pjsip 2.9
    func play_sound_during_call(file: pj_str_t, callid: pjsua_call_id) -> pj_status_t {
        var status = pj_init()
        if status != PJ_SUCCESS.rawValue {
            return status
        }
        /* Must create a pool factory before we can allocate any memory. */
        let str = String(cString: file.ptr, encoding: .utf8)
        status = pjmedia_wav_player_port_create(pool, str, 20, 0, 0, &file_port_Player);
        if status != PJ_SUCCESS.rawValue {
            return status
        }
        /* Create sound player port. */
    //    status = pjmedia_snd_port_create_player(pool,       /* pool         */
    //        -1,         /* use default dev.        */
    //        PJMEDIA_PIA_SRATE(&file_port_Player!.pointee.info),/* clock rate.     */
    //        PJMEDIA_PIA_CCNT(&file_port_Player!.pointee.info),/* # of channels.       */
    //        PJMEDIA_PIA_SPF(&file_port_Player!.pointee.info), /* samples per frame.   */
    //        PJMEDIA_PIA_BITS(&file_port_Player!.pointee.info),/* bits per sample.     */
    //        0,      /* options      */
    //        &snd_port_Player       /* returned port       */
    //    )
    //    status = pjmedia_snd_port_connect( snd_port_Player, file_port_Player)
        if status != PJ_SUCCESS.rawValue {
            return status
        }
        var ci = pjsua_call_info()
        pjsua_call_get_info(callid, &ci)
        let portid = pjsua_call_get_conf_port(callid)
        var recordPort = pjmedia_conf_port_info()
        pjmedia_conf_get_port_info(medconf, recSolt, &recordPort)

        var strName = pj_str_t(ptr: convertToChar("PlayerName"), slen: 10)
        status = pjmedia_conf_add_port(medconf, pool, file_port_Player, &strName, &playSolt)

        var playPort = pjmedia_conf_port_info()
        pjmedia_conf_get_port_info(medconf, playSolt, &playPort)

        status = pjmedia_conf_connect_port(medconf, playPort.slot, 0, 0)
        status = pjmedia_conf_connect_port(medconf, playPort.slot, recordPort.slot, 0)
        status = pjmedia_conf_connect_port(medconf, playPort.slot, UInt32(portid), 0)

    //    status = pjsua_conf_connect(pjsua_conf_port_id(playPort.slot), 0)
    //    status = pjsua_conf_connect(pjsua_conf_port_id(playPort.slot), pjsua_conf_port_id(recordPort.slot))
        status = pjsua_conf_connect(pjsua_conf_port_id(playPort.slot), portid)
        pj_thread_sleep(100)
        return status
    }

我已经尝试了上述方法来在通话过程中进行录制和播放。我不会在接收方听到蜂鸣声。而且我正在播放的声音在接收器端太低。如果我有任何错误,请查看上面的代码并提供帮助。

我发现记录器ID和callinfo.conf_port ID是相同的。并没有找到任何方法来在包装的media_conf中获取conf_slot。请帮助我,我被困在这几天了。

swift voip pjsip
1个回答
1
投票
您应该改用pjsua文件播放器(pjsua_player *)和pjsua文件记录器(pjsua_recorder *)。
© www.soinside.com 2019 - 2024. All rights reserved.