20

私は現在、バイト配列の形式で PCM オーディオを持っています。形式は符号付き 16 ビット リトルエンディアンです。これを Android で再生可能な形式、できればバージョン 3.2 以降に変換したいと思います。これを行う方法について誰か提案がありますか? 私はいくつかの調査を行い、以下を試しましたが、どれも成功しませんでした。誰かがより良い方法を提案したり、どこが間違っているかを示していただければ幸いです。

正しいオーディオ設定で AudioFormat を作成しようとしましたが、Android は javax.sound.sampled ライブラリをサポートしていません。

また、PCM データを wave ファイルに書き込もうとしましたが、必要なすべての wav ヘッダー情報を取得するのに問題が発生しています。

また、Android が提供する AudioTrack クラスを使用して、PCM データを再生しようとしました。しかし、どうやら音は聞こえないようです。これが私の方法です:

    public void playback(){
         try{
              AudioTrack audioTrack = new  AudioTrack(AudioManager.STREAM_VOICE_CALL, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 500000, AudioTrack.MODE_STATIC);
              audioTrack.write(audio, 0, 500000);

      } catch(Throwable t){
        Log.d("Audio","Playback Failed");
    }
}

任意の提案をいただければ幸いです。

4

2 に答える 2

22

http://developer.android.com/reference/android/media/AudioTrack.html

このクラスはまさにあなたが必要とするものを持っているようです!

write(byte[] audioData, int offsetInBytes, int sizeInBytes)

オーディオ データをオーディオ ハードウェアに書き込み、再生します。

編集

ストリームを次のように変更しますAudioManager.STREAM_MUSIC

于 2012-06-29T19:19:59.860 に答える
18

問題は、あるソースから受け取った PCM サンプルを Android アプリで直接再生したいのか、それとも変換する必要のある外部ファイルがあるのか​​ということです。最初のケースでは、jack57 が説明したように進みます。とても簡単で、マーカーを追加して正確なタイミングを設定することもできます。

int bufferSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

AudioTrack mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize, AudioTrack.MODE_STREAM);

mAudioTrack.play();

次に、サイクルで write メソッドを呼び出します。

mAudioTrack.write(buffer, 0, buffer.length);

2 番目のケースでは、無料のオーディオ エディタを使用してください: http://audacity.sourceforge.net/download/。PCM サンプルを .txt ファイルとして保存し、エディターで開いて、必要な形式で保存できます...

于 2012-06-29T19:32:44.270 に答える