4

我正在使用音频流在设备上播放 MP3 文件,并且在 ICS 出现之前没有任何问题。然后我认为这可能是格式支持问题,所以我尝试了使用以下代码的 OGG 文件:

MediaPlayer mmp= MediaPlayer.create(context,
                      Uri.parse("http://vorbis.com/music/Epoq-Lepidoptera.ogg"));
mmp.start();

这适用于早期的操作系统版本,但在 ICS 上失败。我也尝试过setDataSource(this, uri)使用 onPreparesListener atc 创建媒体播放器,但仍然出现相同的错误:

04-08 09:52:12.459: D/MediaPlayer(541): 无法在客户端打开文件,正在尝试服务器端
04-08 09:52:12.489: E/MediaPlayer(541): 无法创建媒体播放器
04-08 09:52:12.529:D/MediaPlayer(541):创建失败:
04-08 09:52:12.529: D/MediaPlayer(541): java.io.IOException: setDataSource failed.: status=0x80000000
04-08 09:52:12.529:D/MediaPlayer(541):在 android.media.MediaPlayer._setDataSource(本机方法)
04-08 09:52:12.529: D/MediaPlayer(541): 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:844)
04-08 09:52:12.529: D/MediaPlayer(541): 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:806)
04-08 09:52:12.529: D/MediaPlayer(541): 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:761)
04-08 09:52:12.529: D/MediaPlayer(541): 在 android.media.MediaPlayer.create(MediaPlayer.java:695)
04-08 09:52:12.529: D/MediaPlayer(541): 在 android.media.MediaPlayer.create(MediaPlayer.java:676)

所以我的问题是如何在 ICS 上使用 MediaPlayer 流式传输音频文件?有没有人有工作代码,或者可能必须有一些特定的文件格式和编码?但它很糟糕,新的操作系统版本不能向后兼容......

4

1 回答 1

0

我也遇到了同样的问题,所以我换了档,而是这样做了,这对我来说效果很好。但是,您必须将声音文件保存在 res/assets 文件夹中。

        try {
            AssetFileDescriptor afd = getAssets().openFd("mysound.mp3");
            mPlayer = new MediaPlayer();
            mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
            mPlayer.prepare();
            mPlayer.start();
        } 
        catch (IllegalStateException e) {
            Log.d(TAG, "IllegalStateException: " + e.getMessage());
        }
        catch (IOException e) {
            Log.d(TAG, "IOException: " + e.getMessage());
        }
        catch (IllegalArgumentException e) {
            Log.d(TAG, "IllegalArgumentException: " + e.getMessage());
        }
        catch (SecurityException e) {
            Log.d(TAG, "SecurityException: " + e.getMessage());
        }  

然后你会以通常的方式释放资源:

        if(mPlayer != null) {
            if(mPlayer.isPlaying()) mPlayer.stop();
            mPlayer.release();
            mPlayer = null;
        }

希望这对你也有效。

于 2012-05-31T19:07:14.083 回答