Android 사용자 정의 ROM에서 통화 중 음성 재생 수정


78

일반 전화 통화 재생 사운드에 전처리를 추가하기 위해 Android OS (AOSP의 공식 이미지)를 수정하고 싶습니다.

나는 이미 앱 오디오 재생에 대해이 필터링을 달성했습니다 ( HAL 및 audioflinger 수정 ).

특정 기기 (Nexus 5X) 만 타겟팅해도 괜찮습니다. 또한 재생 만 필터링하면됩니다. 녹음 (업 링크)은 신경 쓰지 않습니다.

업데이트 # 1 :

명확히하기 위해 Qualcomm 전용 드라이버를 수정하거나 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올바른주의를 끌 수 있으며 결국이 질문의 문제를 해결하는 데 도움이 될 것입니다.


그렇게하고 싶었습니다. 키워드 호출을 모니터링 한 다음 호출에 사운드를 삽입하도록합니다. 내가 "골프"라고 말하면 골프 박수 소리가 호출에 주입됩니다.
— danny117

ndk-jni를 사용하지 않고 표준 i / o를 수정할 수 있는지 의심합니다
— Pararth

1
나는 일반 앱이 아닌 맞춤형 ROM을 만드는 것에 대해 이야기하고 있습니다.
— SirKnigget

IIRC, 전화 통화는 민감한 정보로 간주되며 개방형 소프트웨어는 이에 액세스 할 수 없습니다. "라디오"로 알려진 폐쇄 소스 펌웨어를 해킹해야합니다. 아마도 불가능할 것입니다.
— Zdenek

그건 사실이 아니야. 통화 녹음 API가 있으며 많은 장치에서 다양한 해킹을 사용하여이를 사용하는 방법을 찾은 수많은 앱이 있습니다.
— SirKnigget

답변:


1

내 마음에 떠오르는 몇 가지 가능한 문제가 있습니다. 빈 버퍼는 잘못된 소스를 선택했음을 나타낼 수 있습니다. 또한 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.