web-dev-qa-db-ja.com

Android)を使用したAACオーディオのストリーミング

私が理解しているように、Androidは、MPEG-4または3GPPとしてエンコードされている場合にのみ、AAC形式のオーディオを再生します。

アプリに対してローカルの場合、M4AとしてエンコードされたAACオーディオを再生できますが、サーバーから取得すると失敗します。

M4aファイルはres/rawディレクトリにローカルに保持されているため、次のように機能します。

MediaPlayer mp = MediaPlayer.create(this, R.raw.*file*);
mp.start();

以下は機能しません。 (しかし、MP3ではそうです)。

Uri uri = Uri.parse("http://*example.com*/blah.m4a");
MediaPlayer mp = MediaPlayer.create(this, uri);
mp.start();

M4aオーディオファイルがローカルでないときに失敗する理由を誰かが明らかにすることはできますか?

ここに(いくつかの)エラーがあります...

ERROR/PlayerDriver(542): Command PLAYER_INIT completed with an error or info UNKNOWN PVMFStatus
ERROR/MediaPlayer(769): error (200, -32)  
WARN/PlayerDriver(542): PVMFInfoErrorHandlingComplete  
DEBUG/MediaPlayer(769): create failed:  
DEBUG/MediaPlayer(769): Java.io.IOException: Prepare failed.: status=0xC8  
DEBUG/MediaPlayer(769):     at Android.media.MediaPlayer.prepare(Native Method)  
DEBUG/MediaPlayer(769):     at Android.media.MediaPlayer.create(MediaPlayer.Java:530)  
DEBUG/MediaPlayer(769):     at Android.media.MediaPlayer.create(MediaPlayer.Java:507)   
...

SDK1.6をターゲットにしています。

20
bdls

この回避策を使用すると、ネットからM4Aファイル(およびMP4や3GPなどの他のコンテナ内のAACファイル)を再生できます。ファイルをダウンロードしてキャッシュから再生するだけです。

private File mediaFile;

private void playAudio(String mediaUrl) {
    try {
        URLConnection cn = new URL(mediaUrl).openConnection();
        InputStream is = cn.getInputStream();

        // create file to store audio
        mediaFile = new File(this.getCacheDir(),"mediafile");
        FileOutputStream fos = new FileOutputStream(mediaFile);   
        byte buf[] = new byte[16 * 1024];
        Log.i("FileOutputStream", "Download");

        // write to file until complete
        do {
            int numread = is.read(buf);   
            if (numread <= 0)  
                break;
            fos.write(buf, 0, numread);
        } while (true);
        fos.flush();
        fos.close();
        Log.i("FileOutputStream", "Saved");
        MediaPlayer mp = new MediaPlayer();

        // create listener to tidy up after playback complete
        MediaPlayer.OnCompletionListener listener = new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer mp) {
                // free up media player
                mp.release();
                Log.i("MediaPlayer.OnCompletionListener", "MediaPlayer Released");
            }
        };
        mp.setOnCompletionListener(listener);

        FileInputStream fis = new FileInputStream(mediaFile);
        // set mediaplayer data source to file descriptor of input stream
        mp.setDataSource(fis.getFD());
        mp.prepare();
        Log.i("MediaPlayer", "Start Player");
        mp.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
5
bdls

ローカルファイルまたはオンライン/ストリーミングソースの両方のオーディオを処理する方法を示す オープンソースOpenMXPlayer があります。 AACだけでなく、他の一般的な形式もサポートしています。

その背後にある考え方は、Android 4.1で導入されたMEdiaCodecAPIを使用することです。

これが、迅速で手間のかからないオーディオプレーヤーの実装を必要とする人にとって、良い出発点となることを願っています。

4
radhoo

Android用のフリーウェアAdvanced Audio(AAC)デコーダー があります。これをヘルプとガイダンスに使用したり、マルチプレイヤークラスを使用してaacオーディオを再生したりできます。理解に役立つサンプルアプリとライブラリが含まれています

お役に立てれば

2

私も試してみましたが、解決策が見つかりませんでした!

前回のGoogleI/Oで、私は大いに役立つ何かを見ました。 MediaPlayerから拡張され、多くの点で改善されています。見てください。

EXOPLAYERはあなたを大いに助けることができます

例のこの部分を確認してください。

private static final int BUFFER_SEGMENT_SIZE = 64 * 1024;
private static final int BUFFER_SEGMENT_COUNT = 256;
...

// String with the url of the radio you want to play
String url = getRadioUrl();
Uri radioUri = Uri.parse(url);
// Settings for exoPlayer
Allocator allocator = new DefaultAllocator(BUFFER_SEGMENT_SIZE);
String userAgent = Util.getUserAgent(context, "ExoPlayerDemo");
DataSource dataSource = new DefaultUriDataSource(context, null, userAgent);
ExtractorSampleSource sampleSource = new ExtractorSampleSource(
radioUri, dataSource, allocator, BUFFER_SEGMENT_SIZE * BUFFER_SEGMENT_COUNT);
audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource);
// Prepare ExoPlayer
exoPlayer.prepare(audioRenderer);

EXOPLAYER-ストリーミング(ビデオとオーディオ)から何でも再生できます!

それを実装するのに助けが必要な場合は私に知らせてください! :)

1
Cristofer

これは暗闇の中でのワイルドショットですが、Flash Playerでも同様の動作が見られ、実際にはファイル名を無視し、サーバーから送信されたMIMEタイプのみに依存しています。 example.comから送信されているヘッダーについて何か考えはありますか?ヘッダーを設定してバイナリデータをストリーミングできるページでblah.m4aをラップしてみることをお勧めします。これらのタイプを試してみると、コミュニティは何が機能するかを確認していただければ幸いです。

オーディオ/ mpegオーディオ/ mp4aオーディオ/ mp4a-latmオーディオ/ aacオーディオ/ x-aac

0
Goyuix

私が開発している音楽プレーヤーに使用しているクラウドベースのソリューションについて、小さなブログを書きました。これは、まだ利用できない若いAndroidクラウドサービス(ACS)プロジェクトに基づいていますが、それでも、クラウドベースのトランスコーディングを使用してメディアファイルをストリーミングする潜在的なソリューションを示しています。見てください: http://positivelydisruptive.blogspot.com/2010/08/streaming-m4a-files-using-Android-cloud.html

ジョエル

0
Joel Grenon