- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我制作了 VOIP 应用程序。现在我需要实现通话录音功能。我正在使用以下功能进行通话录音:
+(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 次录音。当我开始第 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_id 录制。
谢谢。
关于ios - 如何在 ios 中使用 pjsip 进行通话录音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48622924/
这与 What is call/cc? 有关,但我不想为了自己的目的劫持这个问题,并且它的一些论点(例如与 setjmp/longjmp 的类比)回避了我。 我想我对什么是延续有足够的了解,我认为它是
我一直在浏览 Skype 开发 API,并想知道是否有一种方法可以让我知道 Skype 是否正在通过某些 API 运行事件调用。 Skype.Client.IsRunning 告诉 Skype 应用程
这个问题的两个小部分希望能为我消除一些歧义。 首先,调用WCF服务哪个更好? using (var myService = new ServiceClient("httpBinding")){
我在我的 Objective-C 应用程序中使用 CallKit。 我可以使用 CallKit 调用电话。如果有第二个电话打进来,我成功地将其设置为保持状态。当我结束第二个电话时, - (void)p
是否可以使用 java(JME 或 Android)捕获语音音频流,对其进行自定义加密,然后通过常规 GSM 调用将其作为常规流发送?当然,在其他手机上解密密码。是否允许应用程序级别的 java 拦截
我正在为 iOS 进行个人调整。我想在电话显示任何内容之前断开/连接电话。我连接到类 SBUIFullscreenAlertAdapter 的 initWithAlertController: 方法。
我对 callkit 有疑问(但不是真的)。 我在我的应用程序中实现了 callkit,它运行良好。我可以接到我的应用程序的第二个电话,callkit 为我提供了结束并接受、拒绝或保留并接受的选项。如
我一直在寻找在两个同伴之间进行实时语音(通话)的方法,但只找到了如何录制语音并发送它们或发送照片和文本。但我想要的是两个同伴能够互相打电话。那么,在 Android 上使用 WiFi P2P 管理器是
怎么了伙计们!好久没问过关于SO的问题了,感觉有点脱节,哈哈。无论如何,我最近使用 VOIP 发现了美妙的网络语音通话世界。和 WebRTC 我正在为我的一个想法进行一些研发,并且我基本上会喜欢以下问
我正在制作一个可以调用电话的应用程序,但我需要帮助才能在不显示拨号界面的情况下调用电话,例如,如果我按下按钮调用,它会调用电话但会停留在同一位置: 这是我的应用程序界面: 我不需要这个拨号界面,当按下
我是 Android 开发的新手(例如,我知道在 iOS 中这是不可能的)。 我知道,我需要打电话: Intent intent = new Intent(Intent.ACTION_CALL); i
注意:事实证明,原始问题的假设是不正确的。在底部查看有关其编辑的更多详细信息。 现在是关于节电模式,而不是节电模式和打盹模式。它也不是关于 Service&BroadcastReceiver,而只是
我正在开发一个机器人,您可以通过 Skype 向其发送消息和调用。该机器人在 Azure 函数中运行。我的消息部分正在工作。我已在 Azure 中将机器人配置为具有调用功能,并且我可以调用该机器人,但
在我的应用中,用户可以选择 call 联系人簿中的其他人。启动 call 应用程序很容易,但是我想知道的是,在 call 发生时我们是否可以播放简短的音乐文件,因此用户可以通过直接 call 他们的
我正在开发一个机器人,您可以通过 Skype 向其发送消息和调用。该机器人在 Azure 函数中运行。我的消息部分正在工作。我已在 Azure 中将机器人配置为具有调用功能,并且我可以调用该机器人,但
在这个问题的某些版本中,OP 会说“我如何在下午 5 点在我的应用程序中触发方法调用?” 然后人们会回答“你怎么知道你的应用会在下午 5 点打开”?这变成了另一个问题,原来的问题消失了。 所以让我们避
我想在单击按钮时发起 Skype 通话。我查找了几种可用的解决方案,但我猜大多数都已经过时并且无法正常工作。有人可以帮我解决这个问题吗?我是 Android 编程的新手。我已经包含在下面的代码中。任何
在 iOS 上,是否可以通过 URI 启动 Skype 语音通话,同时将我的应用程序保持在前台? 如果是这样,是否也可以通过启用扬声器的 URI 启动 Skype? (为什么?我正在尝试支持语音通信,
我在 Play 商店中有十几个应用程序,它们都是相同的,但针对不同的客户端进行了 UI 调整。我最近收到一封来自 Google Play 的自动电子邮件,内容涉及我的 2 个应用程序(但不是其他应用程
我想在 android 中进行 SIP 点对点 VoIP 调用。此调用应在本地网络中进行,无需访问互联网。事实上,我不想使用任何外部服务器来注册配置文件。但是我不知道在配置文件生成器的 serverD
我是一名优秀的程序员,十分优秀!