Pjsip iOS如何将声音传输到接收方并进行记录? [英] Pjsip iOS How to transmit sound to receiver side and record it?
问题描述
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)
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)
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)
}
func stopSipRecordingandBeep(isBeep: Bool) -> Bool {
var status:pj_status_t = 1
if let medEndPoint = medconf {
pjmedia_conf_destroy(medEndPoint)
}
if let fileport = file_port {
status = pjmedia_port_destroy(fileport)
}
if isBeep {
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
}
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
}
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), portid)
pj_thread_sleep(100)
return status
}
我已经尝试了上述方法在通话过程中进行录制和播放.我不会在接收方听到蜂鸣声.而且我正在播放的声音在接收器端太低.如果我有任何错误,请查看上面的代码并提供帮助.
I have tried the above methods to record and play during the call. I am not getting and beep at the receiver side. And the sound that I am playing is too low at the receiver side. Please look into the above code and help if I am making any mistakes.
我发现记录器ID和callinfo.conf_port ID是相同的.并没有找到任何方法来将conf_slot获取到已创建的media_conf中.请帮我,我被困在这几天了.
I found that recorder id and callinfo.conf_port id is the same. and did not find any way to get the conf_slot in crated media_conf. Please help me I am stuck in this for days.
推荐答案
您应该改用pjsua文件播放器(pjsua_player *)和pjsua文件记录器(pjsua_recorder *).
You should use pjsua file player (pjsua_player*) and pjsua file recorder (pjsua_recorder*) instead.
调用pjsua_player_create()/pjsua_recorder_create()创建播放器/记录器.
Call pjsua_player_create()/pjsua_recorder_create() to create the player/recorder.
要获取conf端口,可以使用pjsua_player_get_conf_port()/pjsua_recorder_get_conf_port().
And to get the conf port, you can use pjsua_player_get_conf_port()/pjsua_recorder_get_conf_port().
您应该能够在pjsua_app.c上看到示例实现
You should be able to see the sample implementation on pjsua_app.c
这篇关于Pjsip iOS如何将声音传输到接收方并进行记录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!