2

我有一个使用 MediaPlayer 流式传输的歌曲列表。有些歌曲一直有效,而另一些则一直无效。我看不出这些文件之间有什么区别,而且它们似乎在 iTunes 等中可以正常播放。

当歌曲失败时,它会在 mediaPlayer.prepare() 行上抛出 IllegalStateException。抛出的 IllegalStateException 中没有有用的信息,(detailMessage 为 null,stackState 为 null)

这是我的代码

try {
    mediaPlayer.setDataSource(media.url);
    setPlayerState(PlayerState.PREPARING);
    mediaPlayer.prepare();
} catch (Exception e) {
    e.printStackTrace();
    Log.e(TAG, "bad stream");
}

这是不起作用的文件的网址:skdy.bryceb.dev.mediarain.com/song.m4a

这是一个有效的方法:skdy.bryceb.dev.mediarain.com/song2.m4a

任何想法为什么这适用于某些歌曲而在其他歌曲上失败?

4

2 回答 2

3

谢谢 MisterSquonk,我相信这种方式会奏效。

在我的特殊情况下,在将我的头撞到墙上一段时间后,我意识到在某些歌曲中,我在播放器状态设置为准备之前达到了缓冲量。所以我添加了一个检查以确保 MediaPlayer 处于“准备就绪”状态,然后它运行良好:

// Media prepared listener
    mediaPlayer.setOnPreparedListener(
            new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                    setPlayerState(PlayerState.PREPARED);
                }
            });

    // Media buffer listener
    mediaPlayer.setOnBufferingUpdateListener(
            new MediaPlayer.OnBufferingUpdateListener() {
                public void onBufferingUpdate(MediaPlayer mp, int percent) {

                    // Sometimes the song will finish playing before the 100% loaded in has been
                    // dispatched, which result in the song playing again, so check to see if the 
                    // song has completed first
                    if(getPlayerState() == PlayerState.COMPLETED)
                        return;

                    if(getPlayerState() == PlayerState.PAUSED)
                        return;

                    // If the music isn't already playing, and the buffer has been reached
                    if(!mediaPlayer.isPlaying() && percent > PERCENT_BUFFER) {
                        if(getPlayerState() == PlayerState.PREPARED)
                        {
                            mediaPlayer.start();
                            setPlayerState(PlayerState.PLAYING);
                        }
                        //if it isn't prepared, then we'll wait till the next buffering
                        //update
                        return;
                    }
                }
            });
于 2010-12-15T22:07:13.170 回答
0

好的,我在“沙盒”应用程序/活动中编写了一个最小的 Mediaplayer 实现,我总是保留备用以进行测试。

我可能是错的,但如果你通过网络流式传输这些歌曲,你需要在 URL 前加上 http://。

我用 Winamp 和 Chrome 逐字(无协议前缀字符串)尝试了 url,它们运行良好,尽管这两个应用程序很可能会使用某种形式的智能来计算如何连接/流式传输。

如果我在我的 mediaPlayer 代码中尝试这样做,我会得到与您相同的异常,但如果我在 URL 前加上 http:// 前缀,则歌曲播放正常。

例子...

// Activity scope
Button button;
CheckBox checkBox;
String url = "";

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //button declared in my activity
    button = (Button)findViewById(R.id.button);
    button.setOnClickListener(this);

    if (!checkBox.isChecked())
        url = getString(R.string.url_song1);
    else
        url = getString(R.string.url_song2);

    mediaPlayer = new MediaPlayer();
}

@Override
public void onClick(View arg0) {
    try {
        Log.i(TAG, "onClick() entered...");
        mediaPlayer.setDataSource(url);
        Log.i(TAG, "Preparing mediaplayer...");
        mediaPlayer.prepare();
        Log.i(TAG, "Starting mediaplayer...");
        mediaPlayer.start();
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, "bad stream");
    }       
}

如果我将歌曲复制到我的 SD 卡中,它们都可以正常播放,并且只要 Internet url 字符串具有“http://”前缀,那么它们也可以正常工作。

于 2010-12-15T03:40:27.853 回答