在Android定制ROM中修改通话中的声音播放
我想修改Android OS(AOSP官方图像),将预处理添加到正常的电话播放声音中。在Android定制ROM中修改通话中的声音播放
我已经(通过修改HAL和audioflinger)来实现这种过滤应用程式音频播放。
我确定只定位特定设备(Nexus 5X)。另外,我只需要过滤回放 - 我不关心录音(上行链路)。
更新#1:
要清楚 - 我和修改特定高通公司司机行,或任何部分,它是在Nexus 5X运行,可以帮我修改的通话中播放。
更新#2:
我试图创建一个Java应用程序层的路由手机播放实时的音乐流。
我已经成功安装它作为系统应用程序,获取初始化AudioRecord
与AudioSource.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_usecase
在hardware/qcom/audio/hal/voice.c
但是,我无法理解它(如何使它按照我想要的方式工作)。
更新#3:
我关于使用AudioSource.VOICE_DOWNLINK
,这可能会得出正确的注意,并最终帮我解决这个问题的问题,以及开a more-specific question。
我认为有几个可能的问题。空白缓冲区可能表示您选择了错误的源。此外,根据https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int,%20int,%20int,%20int,%20int),即使配置出现问题,您可能也不会总是发生异常,您可能需要确认您的对象是否已正确初始化。如果一切都失败了,你也可以做一个 “mRecord.setPreferredDevice(AudioDeviceInfo.TYPE_BUILTIN_EARPIECE);” 将手机的内置耳机直接连接到录音机的输入端。是的,这有点肮脏和黑客,但也许适合的目的。
另一件令我感到困惑的事情是,不是使用构建器类,而是尝试通过构造器直接配置对象。是否有一个特定的原因,您不想使用AudioRecord.Builder(在https://developer.android.com/reference/android/media/AudioRecord.Builder.html甚至有一个很好的例子)?
您提出的所有观点都已经过检查,这与此无关。 Builder类确实是更新的,但内部它到达完全相同的地方(检查Android源代码)。 – SirKnigget
因此,插入内置听筒信号源的功能无法用作解决方法吗? – CoolKoon
不是。它与潜在问题无关。 – SirKnigget
我想这样做。只是为了让它监控关键字的呼叫,然后在呼叫中注入声音。就像我说的“高尔夫球”,然后在呼叫中注入高尔夫拍手声。 – danny117
我怀疑如果修改标准I/O是可能的,而不玩ndk-jni – user2450263
我正在谈论创建自定义ROM,而不是一个正常的应用程序。 – SirKnigget