- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
自从我的 Galaxy S5 更新了 lolipop 后,我尝试在我的应用程序中修复通话录音。作为基础,我从这里使用谷歌示例项目:Sample .
这是代码的主要部分:
SLresult result;
sampleInfo_ = *sampleFormat;
SLAndroidDataFormat_PCM_EX format_pcm;
ConvertToSLSampleFormat(&format_pcm, &sampleInfo_);
gFp = fopen("/storage/emulated/0/file.pcm", "w");
// configure audio source
SLDataLocator_IODevice loc_dev = {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT,
SL_DEFAULTDEVICEID_AUDIOINPUT, NULL};
SLDataSource audioSrc = {&loc_dev, NULL};
// configure audio sink
SLDataLocator_AndroidSimpleBufferQueue loc_bq = {
SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE,
DEVICE_SHADOW_BUFFER_QUEUE_LEN};
SLDataSink audioSnk = {&loc_bq, &format_pcm};
// create audio recorder
// (requires the RECORD_AUDIO permission)
const SLInterfaceID id[2] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
SL_IID_ANDROIDCONFIGURATION};
const SLboolean req[2] = {SL_BOOLEAN_FALSE, SL_BOOLEAN_FALSE};
result = (*slEngine)->CreateAudioRecorder(slEngine,
&recObjectItf_,
&audioSrc,
&audioSnk,
2,
id, req);
SLASSERT(result);
// Configure the voice recognition preset which has no
// signal processing for lower latency.
SLAndroidConfigurationItf inputConfig;
result = (*recObjectItf_)->GetInterface(recObjectItf_,
SL_IID_ANDROIDCONFIGURATION,
&inputConfig);
SLuint32 presetValue = SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION;
result = (*inputConfig)->SetConfiguration(inputConfig,
SL_ANDROID_KEY_RECORDING_PRESET,
&presetValue,
sizeof(SLint32));
SLASSERT(result);
result = (*recObjectItf_)->Realize(recObjectItf_, SL_BOOLEAN_FALSE);
SLASSERT(result);
result = (*recObjectItf_)->GetInterface(recObjectItf_, SL_IID_RECORD, &recItf_);
SLASSERT(result);
result = (*recObjectItf_)->GetInterface(recObjectItf_, SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
&recBufQueueItf_);
SLASSERT(result);
result = (*recBufQueueItf_)->RegisterCallback(recBufQueueItf_, bqRecorderCallback, this);
SLASSERT(result);
devShadowQueue_ = new AudioQueue(DEVICE_SHADOW_BUFFER_QUEUE_LEN);
assert(devShadowQueue_);
这是我的问题,此代码不记录通话的另一方,在输出文件中我只能听到麦克风的声音。我尝试更改参数但结果相同。有人知道我做错了什么吗?
最佳答案
我找到了修复 Galaxy S5 通话录音的解决方案。
主要是调用这个:status_t AudioSystem::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
在调用开始时的循环中。
首先得到想要的函数:
open_media = dlopen("/system/lib/libmedia.so", RTLD_LAZY);
set_parameters = (int (*)(int, void *)) dlsym(open_media,
"_ZN7android11AudioSystem13setParametersEiRKNS_7String8E");
接下来我们需要audio_io_handle_t
和String8&
对象:
audio_io_handle_t
- Audio Session id加1,可以从AudioRecord.getAudioSessionId
String8&
这个比较难:
//First inicialize function
create_string = (void (*)(void *, const char *)) dlsym(open_util,
"_ZN7android7String8C2EPKc");
//next call this function to convert string to required object
create_string(&str8, str);
当我们拥有所有需要的部分时,我们可以调用 setParameters 函数:
//remember to call this in loop when recording is starting
set_parameters(id + 1, &str8);
变量声明的样子:
int (*set_parameters)(int, void *);
void (*create_string)(void *, const char *);
void *str8 = 0;
const char *str = "input_source=4";
@ChanchalShelar
@Peter @AkshatVajpayee
这是我的 .cpp 文件的样子:
void *open_media;
void *open_util;
int (*set_parameters)(int, void *);
void (*create_string)(void *, const char *);
void *str8 = 0;
const char *str = "input_source=4";
extern "C" {
JNIEXPORT bool JNICALL
Java_com_sample_NativeAudio_init(JNIEnv *env, jclass);
JNIEXPORT int JNICALL
Java_com_sample_NativeAudio_setParameters(JNIEnv *env, jclass, int id);
}
void get_string8() {
create_string = (void (*)(void *, const char *)) dlsym(open_util, "_ZN7android7String8C2EPKc");
if (!create_string) {
LOGD("There is no create_string function");
} else {
LOGD("create_string function OK");
}
create_string(&str8, str);
if (!str8) {
LOGD("Filed to create str8");
} else {
LOGD("create str8 success");
}
}
JNIEXPORT int JNICALL Java_com_sample_NativeAudio_setParameters(JNIEnv *env,
jclass type, int id) {
if (set_parameters) {
return set_parameters(id + 1, &str8);
}
return 0;
}
JNIEXPORT bool JNICALL Java_com_sample_NativeAudio_init(JNIEnv *env, jclass type) {
open_util = dlopen("/system/lib/libutils.so", RTLD_LAZY);
if (open_util) {
get_string8();
} else {
return false;
}
open_media = dlopen("/system/lib/libmedia.so", RTLD_LAZY);
if (open_media) {
set_parameters = (int (*)(int, void *)) dlsym(open_media,
"_ZN7android11AudioSystem13setParametersEiRKNS_7String8E");
} else {
return false;
}
return true;
}
关于android - 使用 OpenSL 进行通话录音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41615189/
我正在使用 twilio JS 客户端从 Web 进行调用。客户端调用后端获取 token 。这里是返回 token 的后端代码。如何记录通话。表示在哪里设置录制网址。通话成功。但是不知道从哪里传录音
我有一个软件,可以记录 5 秒间隔的声音,然后将其发送进行处理。它在无限循环中运行,如下所示: while (true) { System.out.println("recording..")
我目前正在做一个项目,需要录制 iPhone 播放的声音。通过这个,我的意思是录制在后台播放的声音,如声音剪辑或其他任何东西,而不是使用内置麦克风。 这能做到吗?我目前正在试验 AVAudioReco
当我将蓝牙免提连接到 Android 手机设备时,是否可以使用手机麦克风录制声音并在免提中听到? 我设法通过手机麦克风录制声音,并通过手机扬声器或耳机听到声音。但是当耳机有麦克风时,通常是免提,它默认
我想访问我在我的应用程序中记录的跟踪数据和自定义数据。 有人可以提供不同数据轨道保存在 mp4 中的格式吗? 使用这个例子https://github.com/google-ar/arcore-and
我想知道,在C++中进行音频记录/回放/搜索的跨平台实用工具是什么?我当时在考虑采用ALUT(OpenAL)的路线,但是有更好的方法吗?如果不是,你们是否知道ALUT的任何优秀教程/示例代码? 最佳答
我目前正在开发一个项目,该项目允许用户录制音频消息,但是最近提出了一个要求,允许他们暂停录制过程,然后继续录制(将新的音频追加到之前的录制之后)。 示例: 用户按下记录并进行初始记录。 用户按下暂停按
我见过几个这样的例子,但它们似乎是针对旧版本的 SDK。我正在尝试设置基本的录音,以下代码在针对 SDK 2.0 版时给我一个 NullPointerException。 ContentValues
我开发了一款安卓游戏,使用 Audio Record 获取麦克风输入。 可以看一下https://play.google.com/store/apps/details?id=fixappmedia.m
我想在最近的项目中使用该插件进行音频捕获。我找到了 Matt Diamond 的努力 demo here正如大多数文章所指向的那样。我尝试在本地重新创建这个完全相同的演示,但没有成功。 我包括了所有依
我正在设置录音机,但在 soundRecorder = try AVAudioRecorder(URL: getFileURL(), settings: recordSettings as! [Str
作为一名吉他手,我一直想开发自己的录音、混音软件。我在 Direct Sound、Windows Multimedia(waveOutOpen 等)方面有一些经验。我意识到这将是一个复杂的项目,但纯粹
我不想记录我自己的击键来创建 asciinema 教程,而是想编写它们的脚本,这样我就可以随着时间的推移轻松地改进我的教程,而不必担心每次我想进行更改时都要重做,或者花很多时间尝试更正录音中的错别字。
我正在尝试使用 Flutter 构建一个应用程序,其中包含录音机。如何访问录音机?请帮我弄清楚它的包、依赖项和代码。 最佳答案 您可以使用 audio_recorder 包: https://pub.
掌握 Java Flight recorder (JFR) 配置,我有一个最合理的配置: -XX:+UnlockCommercialFeatures -XX:+DebugNonSafepoints -
我正在尝试播放我从 twilio 取回的通话录音。到目前为止,我在我的网站上有一个所有通话录音的列表,当我点击它们时,它会将我发送到 twilio 以收听它们。然后我发出一个 ajax 请求以从 tw
我们可以用 iPhone 直接线路输入录制音频吗? 最佳答案 唯一的方法是使用底座连接器创建您自己的配件,然后使用提供的 API! 关于iPhone LINE-IN 录音 可以吗?,我们在Stack
基本上,我希望用户使用 SoundCloud 录音机录制声音,一旦他们单击“保存”,他们刚刚录制的声音就会嵌入到我的网页中。 我使用 SC.record() 方法来获取录音。这是我保存录音的功能...
我正在尝试在网站中实现录音。基本上,用户应该能够按下一个按钮并对着麦克风说些什么。然后应将录制的音频发送到服务器以进行进一步处理。我知道您可以使用 Flash 做到这一点,但现在我正在努力避免这种情况
我正在尝试“录制”一个音频文件,我读过这个 doc ,实际上我想在文件中将“采样”值记录为双倍值,这是我使用的代码(不起作用,我不知道为什么没有): /* Use the newer ALSA API
我是一名优秀的程序员,十分优秀!