Android Audio 適応問題の共有:Android デバイスのオーディオ問題を解決する方法を探る
今日の共有では、二つのクライアントデバイスが接続される際に、
携帯電話で録音してもう一方に再生する際に、
一方の音声に問題が発生する場合について探ります。
例えば、ノイズ、音量の不安定さ、突然の変化などです。
これらの問題の可能性のある原因を分析し、
解決策を提供します。
同様の問題を抱えている方、
または興味がある方は、
この共有を参考にしてください。
Samsnug SM-G900I Android 6.0.2
でテストし、再現した結果
- 状況: 背景で音楽が再生されている時
Clinet A と Client B が接続に成功し、通話を行う(録音をもう一方に送信)際に、
Clinet A の携帯電話の音楽にノイズが入り、音量が不安定になり、突然大きくなるなどの問題が発生 - 期待される結果: 背景で音楽が再生されている時、音楽の再生に影響がないこと
- 状況: 背景で音楽が再生されている時
- 初期の方向性として以下の方法で問題解決を試みる
-
アプリのソースコードを読み、特定のコードをミュートしてどの部分が実際に影響を与えるかをテスト
例えば:AudioRecord、AudioTrack
をミュートするなどして、問題の範囲を絞る 関連する可能性を考える
、例えばオーディオフォーカス
を研究する: その特性を発見
携帯電話は一度に一つのアプリしかオーディオフォーカスを取得できない
各アプリはフォーカス喪失のリスナーを設定できる
したがって、このリスナーを検出すると、
各アプリが自動的に音量を下げる可能性がある(これは制御不能)
ただし、現在のコードにオーディオフォーカスを取得する動作があるかどうかを再度調査する- インターネットをサーフィンして、他の人が同じ問題を経験したかどうかを調べる
例えば:ネット記事を参考にする
-
-
問題解決の時間を短縮し、効率を高めて期待される結果を達成するために、
まず上記の第二歩を経て、可能な方向性と解決策を考える
最初から一つの方向に集中して研究し、
最後に間違った方向を見つけることを避けるため
間接的に効率が低下することを避けるため
可能性を考える習慣を持つ -
上記の分析を通じて、いくつかの方法を発見
-
ハードウェア抽象層(HAL)
を調整することで、
ただし、私たちはAndroidアプリケーション層を開発しているため、
HAL
を変更する可能性は非常に低い
ハードウェア開発者でない限り、このルールを根本的に変更することはできない
ここでは他の人が共有した変更方法:
デバッグノート — リアルタイム録音にノイズが発生する問題 -
もう一つの方法は、AudioSourceの入力元を変更することです。
AudioSource.DEFAULT:默認音頻來源 AudioSource.MIC:麥克風(一般主mic的音源) AudioSource.VOICE_UPLINK:電話上行 AudioSource.VOICE_DOWNLINK:電話下行 AudioSource.VOICE_CALL:電話、含上下行 AudioSource.CAMCORDER:相機旁的麥克風音源 AudioSource.VOICE_RECOGNITION:語音識別 (語音辨識的音源) AudioSource.VOICE_COMMUNICATION:網路語音通話 (用於網路通話的音源 如VoIP) AudioSource.VOICE_PERFORMANCE 實時處理錄音並播放的音源(通常用於卡拉ok app) AudioSource.REMOTE_SUBMIX 音頻子混音的音源
元のソースコードでは
AudioSource.VOICE_COMMUNICATION
を使用しています。
実際にAudioSource.MIC
またはAudioSource.VOICE_RECOGNITION
を使用して録音すると、
この状況では雑音や音量の変動が発生しません。試行後の行動記録
:
(これは私の例です。同じ問題に直面した場合、参考にしてください。ただし、自分でテストすることをお勧めします。)-
AudioSource.VOICE_COMMUNICATION
は音量の変動、音割れ、雑音を引き起こし、音は拾えますが、親側で受け取る音声に遅延があるように聞こえます。 AudioSource.VOICE_PERFORMANCE
は音量の変動はありませんが、親側で音が受信されません。AudioSource.REMOTE_SUBMIX
は音量の変動はありませんが、システムのキー音しか拾いません。
-
-
- 後にAudio HALにバージョン差異があることが判明しました。
各AndroidバージョンのAudio HAL使用差異の簡単な説明:
Androidバージョン Audio HALバージョン Android 8未満 旧HAL Android 8 2.0 Android 9 4.0 Android 10 5.0 Android 11 6.0 Android 12 7.0 × 内容は公式発表に基づいており、サプライヤーがAudio HALを独自に変更していない場合のバージョンは上記の通りです。
-
旧版Audio HALの情報は公式ドキュメントを参照してください。
-
旧版Audio HALのソースコードを確認できます。
-
新版Audio HALについてはこちらを参照してください。 各バージョンのHAL間には若干の差異がある可能性があるため、問題に応じて研究し、アプリケーション層で最適な形に調整することができます。
-
コマンド
adb shell lshal
を使用すると、現在のHIDLのバージョンを確認できます(Android 8.0以降にHIDLが追加されました)。HIDL = HALのAIDLのようなものと考えてください。
-
-
最後のこの問題 私はその時に小さな変更を加えました それは録音の
AudioSource.VOICE_COMMUNICATION
をAudioSource.MIC
に変更することです これで期待通りの効果が得られました -
時には問題を解決するために、
経験や問題が一目でわからないことがあります。
このようなハードウェアの調整の問題では、
一つ一つ理解し分析する必要があります。
最後には一行のコード変更だけで済むかもしれませんが、
問題解決の過程で
開発しているものの実際のノウハウを
より深く理解することができます。
これが将来他の問題に直面した時や関連する問題に役立ちます。
これらは将来の経験となります。 -
もちろん、問題によって
解決にどれだけの時間をかけるかを決める必要があります。
それがあなたの発展に役立つかどうかも
自分で考える必要があります。 -
しかし、私は多く研究する習慣があります。
問題を解決した時に質問されても
自分がどう解決したかを知らないことがないようにするためです。
これは一種の保険行動とも言えます。