【问题标题】:Android Media player error (1,-4) while playing an audio from Assets folder播放 Assets 文件夹中的音频时出现 Android 媒体播放器错误 (1,-4)
【发布时间】:2012-06-19 08:50:57
【问题描述】:

我需要你的帮助。我尝试播放存储在 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();
}

这是我的日志:

06-16 22:39:53.330:W/MediaPlayer(13490):信息/警告 (1, 26)
06-16 22:39:53.330: E/MediaPlayer(13490): 错误 (1, -4)

您能解释一下我的代码有什么问题吗?

提前谢谢你

问候,

普莉丝卡

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    不幸的是,由于某种原因,几乎没有关于 MediaPlayer 错误代码的信息。但是,我建议您尝试将声音文件放入 res/raw/ 而不是资产。

    编辑:

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

    编辑 2:

    原来可以从资产做到这一点看到这个问题:Play audio file from the assets directory

    【讨论】:

    • 实际上我将音频文件名存储在数据库中,并将真实音频文件存储在 assets 文件夹中。我使用 sqlite 查询从数据库中检索文件名,一旦单击特定音频文件,就会播放 assets 文件夹中的音频。因为我不确切知道点击了哪个音频,所以我不能将音频文件放在 res/raw 文件夹下。有什么想法吗?
    • 感谢您的回复。是的,这就是我所做的,但就像我之前所说的那样,它给了我一个错误。
    【解决方案2】:

    这里你可以看到所有的错误代码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();
            }
    

    【讨论】:

    • 感谢您的回复。我已经尝试了您的建议,没有更多错误(1,-4),但它给了我另一个错误,无法创建媒体播放器。这是我的 logcat 06-16 23:33:53.350: W/System.err(14869): at android.media.MediaPlayer.setDataSource(Native Method)
    【解决方案3】:

    我认为不支持 wma 文件。

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

    我注意到您没有指定 audioStreamType

    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MISIC);

    【讨论】:

    • 是的,我注意到我也将音频文件转换为 .wav 格式,但仍然出现同样的错误“无法创建媒体播放器”。我必须在哪里放置 player.setAudioStream(AudioManager.STREAM_MUSIC) 行?编辑:反正有 setAudioSteamType 函数而不是 setAudioStream。
    【解决方案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();
    

    【讨论】:

    • 谢谢.. 为我工作,但没有 afd.close();在三星我的 10" ICS 选项卡中工作,但不在 Nexus 7 Jellybean 中.. 添加 afd.close() 后;在 Jeallybean 中工作!
    【解决方案5】:

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

        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) {
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2013-01-08
      • 2012-12-20
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多