ICS上的流媒体音频问题

4

我正在使用音频流来播放设备上的MP3文件,在ICS发布之前没有任何问题。然后我认为这可能是一个格式支持问题,因此我尝试使用以下代码来使用OGG文件:

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

这个方法在早期的操作系统版本上有效,但在ICS上失败了。我还尝试使用onPreparedListener在setDataSource(this, uri)创建媒体播放器,但仍然出现相同的错误:

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 失败:status=0x80000000
04-08 09:52:12.529: D/MediaPlayer(541):     at android.media.MediaPlayer._setDataSource(Native Method)
04-08 09:52:12.529: D/MediaPlayer(541):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:844)
04-08 09:52:12.529: D/MediaPlayer(541):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:806)
04-08 09:52:12.529: D/MediaPlayer(541):     at android.media.MediaPlayer.setDataSource(MediaPlayer.java:761)
04-08 09:52:12.529: D/MediaPlayer(541):     at android.media.MediaPlayer.create(MediaPlayer.java:695)
04-08 09:52:12.529: D/MediaPlayer(541):     at android.media.MediaPlayer.create(MediaPlayer.java:676)

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

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;
        }

希望这对你也有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接