从Assets文件夹播放音频时,Android Media播放器错误(1,-4)

时间:2012-06-16 15:59:49

标签: android android-mediaplayer

我需要你的帮助。我尝试播放存储在Assets文件夹中的音频文件,但发生了错误。

以下是我的代码:

try{
  if (player.isPlaying()) {
    player.stop();
    player.release();
  }
}catch(Exception e){
  Toast.makeText(this, "an exception occurred", Toast.LENGTH_LONG).show();
  e.printStackTrace();
}
try{
  AssetFileDescriptor afd = BeeDailyConvo.this.getAssets().openFd("sounds/hello_kr.wma");
  player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
  player.prepare();
  player.start();
}catch(Exception e){
  e.printStackTrace();
}

这是我的logcat:

  

06-16 22:39:53.330:W / MediaPlayer(13490):info / warning(1,26)
  06-16 22:39:53.330:E / MediaPlayer(13490):错误(1,-4)

请您解释我的代码有什么问题?

提前谢谢

此致

普里斯卡

5 个答案:

答案 0 :(得分:4)

此问题已得到解决。

在准备播放器之前必须关闭资产文件描述符。这就是我解决问题的方法:

player = new MediaPlayer();
AssetFileDescriptor afd = BeeDailyConvo.this.getAssets()
  .openFd("sounds/"+file);
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
afd.close();**//just added this line**
player.prepare();
player.start();

答案 1 :(得分:3)

您可以在此处查看所有错误代码Media player Error codes

-4错误代码表示您提供了无效参数。

将您的代码放入try catch块。

尝试使用

    try {
          AssetFileDescriptor afd = CustomListViewActivity.this.getAssets()
                    .openFd("sounds/hello_kr.wma");
            player.setDataSource(afd.getFileDescriptor());
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

答案 2 :(得分:1)

遗憾的是,由于某种原因,关于MediaPlayer错误代码的信息非常少。但是我建议你尝试将声音文件放在res / raw /而不是资源中。

修改

从使用开发人员文档中的MediaPlayer部分开始。这将向您展示如何正确设置和播放声音。

编辑2:

证明可以从资产中执行此操作,请参阅此问题:Play audio file from the assets directory

答案 3 :(得分:1)

我认为不支持wma文件。

http://developer.android.com/guide/appendix/media-formats.html

我注意到你没有指定audioStreamType

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MISIC);

答案 4 :(得分:0)

用这种方式解决你的问题:)

    public void playBeep() {
    try {

        if (m.isPlaying()) {
            m.stop();
            m.release();
            m = new MediaPlayer();
        }
        AssetFileDescriptor descriptor = getAssets().openFd("mp3 name.mp3");
        m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
        descriptor.close();

        m.prepare();
        m.setVolume(1f, 1f);
        m.setLooping(true);
        m.start();
    } catch (Exception e) {
    }
}