8

アクセスポイント経由でWiFiを使用してAndroid携帯から別のAndroid携帯にMP3をストリーミングしようとしています。問題は、OpenSL ESがソースとしてPCMオーディオバッファのみをサポートしているように見えることです(URIを使用していない場合)。送信する前に「マスター」側で潜在的に巨大なファイルをデコードするのではなく、「クライアント」にMP3をPCMにデコードさせたいと思います。これは、単にファイル全体を送信してからデコードするのではなく、ファイルストリームとして発生する必要があることに注意してください。OpenSL ESを使用してこれを実現する方法はありますか?オーディオトラック?かなり一般的なリクエストのようです。

4

3 に答える 3

5

あなたは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でいつでもオーディオの再生を開始してから、バッファーのロードを続行します。ストリーミングプロセスの先を行く限り、問題はありません。

于 2013-02-07T23:09:21.803 に答える
1

あなたはopenslを使用する必要がありますか?MediaCodec(Android 4.2で利用可能)は、mp3をAudioTrackに渡すことができるPCMチャンクにデコードできます。

于 2014-02-14T10:00:23.533 に答える
0

この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/に基づいた優れたストリーミング実装を提供します

于 2013-02-06T13:36:11.350 に答える