在Android自定义ROM中修改通话中的语音播放


78

我想修改Android OS(AOSP的官方图片),以将预处理添加到正常的电话播放声音中。

我已经实现了针对应用程序音频播放的过滤(通过修改HALaudioflinger)。

我可以只定位特定的设备(Nexus 5X)。另外,我只需要过滤播放-我不在乎录制(上行链路)。

更新#1:

明确地说-我可以修改Qualcomm专用的驱动程序,或者可以在Nexus 5X上运行的任何部分,可以帮助我修改通话中的播放。

更新#2:

我正在尝试创建一个Java层应用程序,以将电话播放实时路由到音乐流。

我已经成功地安装它作为系统的应用程序,获得权限初始化AudioRecordAudioSource.VOICE_DOWNLINK。但是,记录给出了空白样本。它不会录制语音电话。

这是我的工作线程中的代码:

// Start recording
int recBufferSize = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
mRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_DOWNLINK, 44100, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, recBufferSize);

// Start playback
int playBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
mTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, playBufferSize, AudioTrack.MODE_STREAM);

mRecord.startRecording();;
mTrack.play();

int bufSize = 1024;
short[] buffer = new short[bufSize];
int res;
while (!interrupted())
{
    // Pull recording buffers and play back
    res = mRecord.read(buffer, 0, bufSize, AudioRecord.READ_NON_BLOCKING);
    mTrack.write(buffer, 0, res, AudioTrack.WRITE_BLOCKING);
}

// Stop recording
mRecord.stop();
mRecord.release();
mRecord = null;

// Stop playback
mTrack.stop();
mTrack.release();;
mTrack = null;

我在Nexus 5X(我自己的AOSP自定义ROM,Android 7.1.1)上运行。我需要找到一个允许通话记录工作的地方-可能hardware/qcom/audio/hal在平台代码中的某个地方。

我也一直在看功能voice_check_and_set_incall_rec_usecasehardware/qcom/audio/hal/voice.c但是我无法理解它(如何使其以我想要的方式工作)。

更新#3:

我已经打开了一个有关using的更具体的问题AudioSource.VOICE_DOWNLINK,它可能引起正确的注意,并最终也将帮助我解决该问题。


我想那样做。只是为了让它监视关键字的通话,然后在通话中注入声音。就像我说的“高尔夫”,然后高尔夫球击掌声被注入到通话中。
danny117 '17

我怀疑在不使用ndk-jni的情况下是否可以修改标准的I / O
Pararth

1
我说的是创建自定义ROM,而不是普通应用。
SirKnigget

在IIRC中,电话被视为敏感信息,开放软件无法访问它。您将不得不破解称为“无线电”的闭源固件。可能不可行。
Zdenek

这不是真的。有一个通话记录API,大量的应用程序通过许多设备上的各种黑客找到了使用它的方式。
SirKnigget

Answers:


1

我想到了几个可能的问题。空白缓冲区可能表明您选择了错误的源。另外,由于根据https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int,%20int,%20int,%20int,%20int),即使有配置错误,您可能需要确认对象是否已正确初始化。如果所有其他方法均失败,则还可以执行“ mRecord.setPreferredDevice(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);”;将电话的内置听筒直接路由到录音机的输入。是的,这有点肮脏,但也许符合目的。

令我感到困惑的另一件事是,您尝试使用其构造函数直接配置对象,而不是使用builder类。您是否有特定的原因为什么不想使用AudioRecord.Builder(甚至在https://developer.android.com/reference/android/media/AudioRecord.Builder.html上还有一个很好的示例)?


您提出的所有观点均已检查,这无关。实际上,Builder类是最新的,但是在内部它完全位于同一位置(请查看Android源代码)。
SirKnigget

因此,插入内置听筒源的功能也无法解决吗?
CoolKoon

否。与根本问题无关。
SirKnigget
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.