Search code examples
iosobjective-ciphonepjsip

How to perform call recording using pjsip in ios?


i make VOIP app.Now I required implementing call recording feature. i am using the following function for call recording:

+(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;
}

For stop recording :

+(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;

  }

}

Above code is working perfectly for 3 recording.When i started 4th recording at that time give me error "error dll_startAudioCapture from pjsua_recorder_create"

so anyone has a solution for call recording using pjsip then please help me.

Thank you.


Solution

  • +(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;
    
    
    //  }
    }
    

    Please replace above method. I have stored recording_id in user default at the time of start recording.For stop, recording gets value from user default and then stop that recording_id recording.

    Thank you.