web-dev-qa-db-ja.com

PCM生バイト[]からオーディオへAndroid

現在、バイト配列形式の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");
    }
}

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

20
ShannonS

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

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

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

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

[〜#〜]編集[〜#〜]

ストリームをAudioManager.STREAM_MUSICに変更します

20
Jack Satriano

問題は、あるソースから受け取った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();

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

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

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

18
vitakot