アクセスポイント経由でWiFiを使用してAndroid携帯から別のAndroid携帯にMP3をストリーミングしようとしています。問題は、OpenSL ESがソースとしてPCMオーディオバッファのみをサポートしているように見えることです(URIを使用していない場合)。送信する前に「マスター」側で潜在的に巨大なファイルをデコードするのではなく、「クライアント」にMP3をPCMにデコードさせたいと思います。これは、単にファイル全体を送信してからデコードするのではなく、ファイルストリームとして発生する必要があることに注意してください。OpenSL ESを使用してこれを実現する方法はありますか?オーディオトラック?かなり一般的なリクエストのようです。
3 に答える
あなたはopenslがmp3ソースで単純なバッファキューをとっていないように見えるのは正しいです。そうは言っても、代わりにSLDataLocator_URIを使用できるはずです。さて、(ストリーミングしているので)開始時に完全なファイルを利用できないことは理解していますが、これを回避する方法があります。空のファイルを作成し、それをopensl URIプレーヤーのソースとして使用すると、すべてが機能するはずです。データ(mp3ファイルのビット)を取得したら、作成した空のファイルにこのデータを追加するだけです。データの追加が完了する前に、このファイルからOpenSLの再生を開始することができます。
次のコマンドで空のファイルを作成します。
RandomAccessFile raf = new RandomAccessFile(new File(mFileUri), "rw");
raf.setLength(audioFileSize);
次のようにオーディオソースを作成します。
SLDataLocator_URI loc_uri = {SL_DATALOCATOR_URI, (SLchar *) fileLoc};
SLDataFormat_MIME format_mime = {SL_DATAFORMAT_MIME, NULL, SL_CONTAINERTYPE_UNSPECIFIED};
SLDataSource audioSrc = {&loc_uri, &format_mime};
以下を使用してバッファをロードします。
for (int i = 0; i < BUFFER_COUNT; i++) {
// get byte[] data from stream
raf.seek(i*Constants.BUFFER_SIZE);
raf.write(data);
}
OpenSLでいつでもオーディオの再生を開始してから、バッファーのロードを続行します。ストリーミングプロセスの先を行く限り、問題はありません。
あなたはopenslを使用する必要がありますか?MediaCodec(Android 4.2で利用可能)は、mp3をAudioTrackに渡すことができるPCMチャンクにデコードできます。
このVictorLazzariniのオーディオプログラミングの例をOpenSLESで試しましたか http://audioprograming.wordpress.com/2012/10/29/lock-free-audio-io-with-opensl-es-on-android/
http://mobilepearls.com/labs/native-android-api/ndk/docs/opensles/に基づいた優れたストリーミング実装を提供します