把mp3文件放在Assets文件夹里,然后用MediaPlayer.setDataSource(FileDescriptor fd)来设置数据源,然后再调用MediaPlayer.prepare();结果报错了:
ERROR/PlayerDriver(30): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
在网上找解决办法,看到大部分的建议是换create(Context context, int resid)来创建一个MediaPlayer,试了一下果然成功,但这是为什么呢?
后来只好查看android的源码,发现MediaPlayer.setDataSource(FileDescriptor fd)是这样实现的:
public void setDataSource(FileDescriptor fd)
throws IOException, IllegalArgumentException, IllegalStateException {
// intentionally less than LONG_MAX
setDataSource(fd, 0, 0x7ffffffffffffffL);
}
其实就是调用了void setDataSource(FileDescriptor fd, long offset, long length)这个函数。
后来我在调式的时候发现,AssetFileDescriptord的offset并不为0。于是改为乖乖的使用setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
然后成功了。
我这样,但忘了关afd.close();//结果没有声音,悲剧,还有 mMediaPlayer.reset();要重置不然再播放会报错
public void playMusic(String mediaName) {
try {
/* 重置MediaPlayer */
mMediaPlayer.reset();
String path="mp3/"+mediaName+".mp3";
// /* 设置要播放的文件的路径 */
AssetFileDescriptor afd = context.getAssets().openFd(path);
mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (IOException ex) {
Log.d(TAG, "create failed:", ex);
// fall through
} catch (IllegalArgumentException ex) {
Log.d(TAG, "create failed:", ex);
// fall through
} catch (SecurityException ex) {
Log.d(TAG, "create failed:", ex);
// fall through
}
}
分享到:
相关推荐
Android 使用MediaPlayer播放assets或者raw目录的音频文件 https://blog.csdn.net/qq_31939617/article/details/80491552
详情见博客:https://blog.csdn.net/qq_20785431/article/details/100543504
Android 使用mediaplayer播放res/raw文件夹中的音乐的实例 (1)在res文件夹中新建一个文件夹重命名为raw,并且将要播放的音乐放到raw文件夹里面 (2)修改layout目录下的xml布局文件,添加3个按钮空间和一个文本...
Android下MediaPlayer播放MP3示例,详细参见博客:http://www.cnblogs.com/plokmju/p/android_MediaPlayer.html
MediaPlaye简介以及使用MediaPlayer播放音频文件
Android MediaPlayer播放mp3的实例
Android使用MediaPlayer高级内容,详情参见博客:http://www.cnblogs.com/plokmju/p/android_MediaPlayerHigh.html
Android MediaPlayer 自定义循环次数
使用MediaPlayer和ProgressBar完成一个MP3的播放,ProgressBar配合Mp3播放进度位置
2.保证无毒 3.简单,方便,实用 4.实例可以自行改用 5.如有非法,本人无法律责任,由改动代码人负责! 6.需要更多本人作品,查找标签“朱建强” 7.请下载,杀毒后再使用!
使用MediaPlayer 播放 MP3 文件 详情请参见: http://blog.csdn.net/aduovip/article/details/6722949
此类是用MediaPlayer播放MP3音频文件的。封装好的代码,大家可以借鉴使用。简单入门,欢迎大家免费下载。
Android MediaPlayer使用方法简单介绍
Android 中级教程之------Android MediaPlayer播放mp3的实例 是提示性代码!
这是一个简单的带有进度条的mediaplayer音频播放器demo,只有一个按键,用来播放和暂停。进度条可以通过拖动来改变播放的进度。供Android初学者参考
介绍了使用MediaPlayer播放音频,实际上,MediaPlayer还可以用来播放视频文件,只不过使用MediaPlayer播放视频时,没有提供图像输出界面。这时,可以使用SurfaceView组件来显示视频图像。使用MediaPlayer和...
Android 视频播放demo MediaPlayer+Surface实现 播放网络视频: MyMediaPlayer.getInstance().play("http://download.cntv.cn/docuchina/PSA/2017/08/28/3b69f457848e0b497b12e356376515df_mpeg28000000PCM.mp4"); ...
簡易Android MediaPlayer,使用android studio開啟,可快轉 倒轉 暫停 停止 撥放,支援音樂時間倒數。
自定义MediaPlayer视频播放器,兼容各种视频类型播放。解决视频加载不出来黑屏问题。
Android开发教程_017_使用Mediaplayer添加音乐_标清