如何在 ios 中使用 pjsip 进行通话录音?
How to perform call recording using pjsip in ios?
我制作 VOIP app.Now 我需要实现通话录音功能。
我正在使用以下功能进行通话录音:
+(NSString *)startRecording:(int)callid userfilename:(NSString
*)filename
{
pjsua_recorder_id recorder_id;
pj_status_t status;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *strPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,filename];
pj_str_t fileName = pj_str([strPath UTF8String]);
status = pjsua_recorder_create(&fileName, 0, NULL, 0, 0, &recorder_id);
NSLog(@"status issss-->%d",status);
pjsua_call_info call_info;
status = pjsua_recorder_create(&fileName, 0, NULL, -1, 0, &app_config.rec_id);
isRecordingStarted = 1;
if (status != PJ_SUCCESS)
{
pjsua_perror(THIS_FILE, "error dll_startAudioCapture from pjsua_recorder_create", status);
}
else
{
app_config.rec_port = pjsua_recorder_get_conf_port(app_config.rec_id);
PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture recId=%d confPort=%d", app_config.rec_id, app_config.rec_port));
/* connect sound port to recorder port */
status = pjmedia_conf_connect_port(pjsua_var.mconf, 0, app_config.rec_port, 0);
if (status != PJ_SUCCESS)
{
pjsua_perror(THIS_FILE, "error dll_startAudioCapture edia_conf_connect_port snd->recport", status);
}
/* connect caller's port to recorder port */
pjsua_call_get_info(0, &call_info); //callid
status = pjmedia_conf_connect_port(pjsua_var.mconf, call_info.conf_slot, app_config.rec_port, 0);
if (status != PJ_SUCCESS)
{
// pjsua_perror(THIS_FILE, @"error dll_startAudioCapture pjmedia_conf_connect_port caller->recport", status);
}
//boost callTaker's and caller audio levels as configured
if ((status = pjmedia_conf_adjust_rx_level(pjsua_var.mconf, pjsua_var.recorder[app_config.rec_id].slot,0)) == PJ_SUCCESS)
{
// PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture pjmedia_conf_adjust_rx_level by %d", g_audCapClientBoost));
}
else
{
pjsua_perror(THIS_FILE, "Error dll_startAudioCapture pjmedia_conf_adjust_rx_level", status);
}
if ((status = pjmedia_conf_adjust_tx_level(pjsua_var.mconf,pjsua_var.recorder[app_config.rec_id].slot,0)) == PJ_SUCCESS)
{
// PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture pjmedia_conf_adjust_tx_level by %d", g_audCapServerBoost));
}
else
{
pjsua_perror(THIS_FILE, "Error dll_startAudioCapture pjmedia_conf_adjust_tx_level", status);
}
}
NSLog(@"str path is====>%@",strPath);
return strPath;
}
停止录制:
+(void)stopRecording:(int)callid
{
// pjsua_call_info call_info;
// pjsua_call_get_info(callid, &call_info);
if(app_config.rec_id != 0)
{
pj_status_t status = pjsua_recorder_destroy(app_config.rec_id);
NSLog(@"sttaus iiisss ----> %d",status);
NSLog(@"recording id is---->%d",app_config.rec_id);
isRecordingStarted = 0;
}
}
上面的代码对 3 完美工作 recording.When 我当时开始第 4 次录音给我错误 "error dll_startAudioCapture from pjsua_recorder_create"
所以谁有使用 pjsip 进行通话录音的解决方案,请帮助我。
谢谢。
+(NSString *)startRecording:(int)callid userfilename:(NSString
*)filename
{
pjsua_recorder_id recorder_id;
pj_status_t status;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *strPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,filename];
pj_str_t fileName = pj_str([strPath UTF8String]);
status = pjsua_recorder_create(&fileName, 0, NULL, -1, 0, &recorder_id);
NSLog(@"status issss-->%d",status);
[[NSUserDefaults standardUserDefaults] setInteger:recorder_id forKey:@"recording_id"];
[[NSUserDefaults standardUserDefaults] synchronize];
pjsua_call_info call_info;
NSLog(@"recordder id id--->%d",recorder_id);
NSLog(@"recording is for start recording is--->%d",app_config.rec_id);
//status = pjsua_recorder_create(&fileName, 0, NULL, -1, 0, &app_config.rec_id);
isRecordingStarted = 1;
if (status != PJ_SUCCESS)
{
pjsua_perror(THIS_FILE, "error dll_startAudioCapture from pjsua_recorder_create", status);
}
else
{
// app_config.rec_port = pjsua_recorder_get_conf_port(app_config.rec_id);
app_config.rec_port = pjsua_recorder_get_conf_port(recorder_id);
PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture recId=%d confPort=%d", app_config.rec_id, app_config.rec_port));
/* connect sound port to recorder port */
status = pjmedia_conf_connect_port(pjsua_var.mconf, 0, app_config.rec_port, 0);
if (status != PJ_SUCCESS)
{
pjsua_perror(THIS_FILE, "error dll_startAudioCapture edia_conf_connect_port snd->recport", status);
}
/* connect caller's port to recorder port */
pjsua_call_get_info(0, &call_info); //callid
status = pjmedia_conf_connect_port(pjsua_var.mconf, call_info.conf_slot, app_config.rec_port, 0);
if (status != PJ_SUCCESS)
{
// pjsua_perror(THIS_FILE, @"error dll_startAudioCapture pjmedia_conf_connect_port caller->recport", status);
}
//boost callTaker's and caller audio levels as configured
if ((status = pjmedia_conf_adjust_rx_level(pjsua_var.mconf, pjsua_var.recorder[app_config.rec_id].slot,0)) == PJ_SUCCESS)
{
// PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture pjmedia_conf_adjust_rx_level by %d", g_audCapClientBoost));
}
else
{
pjsua_perror(THIS_FILE, "Error dll_startAudioCapture pjmedia_conf_adjust_rx_level", status);
}
if ((status = pjmedia_conf_adjust_tx_level(pjsua_var.mconf,pjsua_var.recorder[app_config.rec_id].slot,0)) == PJ_SUCCESS)
{
// PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture pjmedia_conf_adjust_tx_level by %d", g_audCapServerBoost));
}
else
{
pjsua_perror(THIS_FILE, "Error dll_startAudioCapture pjmedia_conf_adjust_tx_level", status);
}
}
NSLog(@"str path is====>%@",strPath);
return strPath;
}
+(void)stopRecording:(int)callid
{
// pjsua_call_info call_info;
// pjsua_call_get_info(callid, &call_info);
NSInteger int_recording_id = [[NSUserDefaults standardUserDefaults] integerForKey:@"recording_id"];
pjsua_recorder_id recorder_id = int_recording_id;
// if(recorder_id != 0)
// {
pj_status_t status = pjsua_recorder_destroy(recorder_id);
NSLog(@"sttaus iiisss ----> %d",status);
NSLog(@"recording id is---->%d",recorder_id);
isRecordingStarted = 0;
// }
}
请替换上面的方法。
我在开始时将 recording_id 存储在用户默认值中 recording.For 停止,记录从用户默认值中获取值,然后停止该 recording_id 记录。
谢谢。
我制作 VOIP app.Now 我需要实现通话录音功能。 我正在使用以下功能进行通话录音:
+(NSString *)startRecording:(int)callid userfilename:(NSString
*)filename
{
pjsua_recorder_id recorder_id;
pj_status_t status;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *strPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,filename];
pj_str_t fileName = pj_str([strPath UTF8String]);
status = pjsua_recorder_create(&fileName, 0, NULL, 0, 0, &recorder_id);
NSLog(@"status issss-->%d",status);
pjsua_call_info call_info;
status = pjsua_recorder_create(&fileName, 0, NULL, -1, 0, &app_config.rec_id);
isRecordingStarted = 1;
if (status != PJ_SUCCESS)
{
pjsua_perror(THIS_FILE, "error dll_startAudioCapture from pjsua_recorder_create", status);
}
else
{
app_config.rec_port = pjsua_recorder_get_conf_port(app_config.rec_id);
PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture recId=%d confPort=%d", app_config.rec_id, app_config.rec_port));
/* connect sound port to recorder port */
status = pjmedia_conf_connect_port(pjsua_var.mconf, 0, app_config.rec_port, 0);
if (status != PJ_SUCCESS)
{
pjsua_perror(THIS_FILE, "error dll_startAudioCapture edia_conf_connect_port snd->recport", status);
}
/* connect caller's port to recorder port */
pjsua_call_get_info(0, &call_info); //callid
status = pjmedia_conf_connect_port(pjsua_var.mconf, call_info.conf_slot, app_config.rec_port, 0);
if (status != PJ_SUCCESS)
{
// pjsua_perror(THIS_FILE, @"error dll_startAudioCapture pjmedia_conf_connect_port caller->recport", status);
}
//boost callTaker's and caller audio levels as configured
if ((status = pjmedia_conf_adjust_rx_level(pjsua_var.mconf, pjsua_var.recorder[app_config.rec_id].slot,0)) == PJ_SUCCESS)
{
// PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture pjmedia_conf_adjust_rx_level by %d", g_audCapClientBoost));
}
else
{
pjsua_perror(THIS_FILE, "Error dll_startAudioCapture pjmedia_conf_adjust_rx_level", status);
}
if ((status = pjmedia_conf_adjust_tx_level(pjsua_var.mconf,pjsua_var.recorder[app_config.rec_id].slot,0)) == PJ_SUCCESS)
{
// PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture pjmedia_conf_adjust_tx_level by %d", g_audCapServerBoost));
}
else
{
pjsua_perror(THIS_FILE, "Error dll_startAudioCapture pjmedia_conf_adjust_tx_level", status);
}
}
NSLog(@"str path is====>%@",strPath);
return strPath;
}
停止录制:
+(void)stopRecording:(int)callid
{
// pjsua_call_info call_info;
// pjsua_call_get_info(callid, &call_info);
if(app_config.rec_id != 0)
{
pj_status_t status = pjsua_recorder_destroy(app_config.rec_id);
NSLog(@"sttaus iiisss ----> %d",status);
NSLog(@"recording id is---->%d",app_config.rec_id);
isRecordingStarted = 0;
}
}
上面的代码对 3 完美工作 recording.When 我当时开始第 4 次录音给我错误 "error dll_startAudioCapture from pjsua_recorder_create"
所以谁有使用 pjsip 进行通话录音的解决方案,请帮助我。
谢谢。
+(NSString *)startRecording:(int)callid userfilename:(NSString
*)filename
{
pjsua_recorder_id recorder_id;
pj_status_t status;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *strPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,filename];
pj_str_t fileName = pj_str([strPath UTF8String]);
status = pjsua_recorder_create(&fileName, 0, NULL, -1, 0, &recorder_id);
NSLog(@"status issss-->%d",status);
[[NSUserDefaults standardUserDefaults] setInteger:recorder_id forKey:@"recording_id"];
[[NSUserDefaults standardUserDefaults] synchronize];
pjsua_call_info call_info;
NSLog(@"recordder id id--->%d",recorder_id);
NSLog(@"recording is for start recording is--->%d",app_config.rec_id);
//status = pjsua_recorder_create(&fileName, 0, NULL, -1, 0, &app_config.rec_id);
isRecordingStarted = 1;
if (status != PJ_SUCCESS)
{
pjsua_perror(THIS_FILE, "error dll_startAudioCapture from pjsua_recorder_create", status);
}
else
{
// app_config.rec_port = pjsua_recorder_get_conf_port(app_config.rec_id);
app_config.rec_port = pjsua_recorder_get_conf_port(recorder_id);
PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture recId=%d confPort=%d", app_config.rec_id, app_config.rec_port));
/* connect sound port to recorder port */
status = pjmedia_conf_connect_port(pjsua_var.mconf, 0, app_config.rec_port, 0);
if (status != PJ_SUCCESS)
{
pjsua_perror(THIS_FILE, "error dll_startAudioCapture edia_conf_connect_port snd->recport", status);
}
/* connect caller's port to recorder port */
pjsua_call_get_info(0, &call_info); //callid
status = pjmedia_conf_connect_port(pjsua_var.mconf, call_info.conf_slot, app_config.rec_port, 0);
if (status != PJ_SUCCESS)
{
// pjsua_perror(THIS_FILE, @"error dll_startAudioCapture pjmedia_conf_connect_port caller->recport", status);
}
//boost callTaker's and caller audio levels as configured
if ((status = pjmedia_conf_adjust_rx_level(pjsua_var.mconf, pjsua_var.recorder[app_config.rec_id].slot,0)) == PJ_SUCCESS)
{
// PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture pjmedia_conf_adjust_rx_level by %d", g_audCapClientBoost));
}
else
{
pjsua_perror(THIS_FILE, "Error dll_startAudioCapture pjmedia_conf_adjust_rx_level", status);
}
if ((status = pjmedia_conf_adjust_tx_level(pjsua_var.mconf,pjsua_var.recorder[app_config.rec_id].slot,0)) == PJ_SUCCESS)
{
// PJ_LOG(5, (THIS_FILE, "dll_startAudioCapture pjmedia_conf_adjust_tx_level by %d", g_audCapServerBoost));
}
else
{
pjsua_perror(THIS_FILE, "Error dll_startAudioCapture pjmedia_conf_adjust_tx_level", status);
}
}
NSLog(@"str path is====>%@",strPath);
return strPath;
}
+(void)stopRecording:(int)callid
{
// pjsua_call_info call_info;
// pjsua_call_get_info(callid, &call_info);
NSInteger int_recording_id = [[NSUserDefaults standardUserDefaults] integerForKey:@"recording_id"];
pjsua_recorder_id recorder_id = int_recording_id;
// if(recorder_id != 0)
// {
pj_status_t status = pjsua_recorder_destroy(recorder_id);
NSLog(@"sttaus iiisss ----> %d",status);
NSLog(@"recording id is---->%d",recorder_id);
isRecordingStarted = 0;
// }
}
请替换上面的方法。 我在开始时将 recording_id 存储在用户默认值中 recording.For 停止,记录从用户默认值中获取值,然后停止该 recording_id 记录。
谢谢。