22

私が理解しているように、MPEG-4 または 3GPP としてエンコードされている場合、Android は 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)   
...

SDK 1.6 をターゲットにしています。

4

5 に答える 5

7

この回避策により、ネットから 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();
    }
}
于 2009-11-04T18:11:38.147 に答える
0

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

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

于 2009-11-02T21:09:23.927 に答える
-3

試す -

1)MP.prepareAsync()

2)onPrepared() { mp.start() }

于 2009-12-31T09:31:54.127 に答える