我有以下代码:
AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();
问题在于,当我运行此代码时,它会按字母顺序开始播放资源目录中的所有音频文件,而不是仅播放我请求的音频文件。我究竟做错了什么?有没有更好的方法从资源目录播放音频文件?
后续问题:
将音频文件保存在assets目录中并将它们保存在res / raw目录中是否有区别?除了他们没有获得ID,如果他们在资产目录中的事实。如果我将音频文件移动到res / raw文件夹,那么我在重用MediaPlayer
时遇到问题,因为setDataSource()
没有id参数。我找不到处理这类问题的好指南。
答案 0 :(得分:226)
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
如果资产中只有一个文件,那么您的版本就可以使用 目录。资产目录内容实际上不是“真实文件” 在磁盘上。所有这些都是一个接一个地组合在一起。所以,如果你这样做 玩家不会指定从哪里开始以及要读取多少字节 读到最后(也就是说,将继续播放资产中的所有文件 目录)
答案 1 :(得分:66)
此功能将正常工作:)
// MediaPlayer m; /*assume, somewhere in the global scope...*/
public void playBeep() {
try {
if (m.isPlaying()) {
m.stop();
m.release();
m = new MediaPlayer();
}
AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.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) {
e.printStackTrace();
}
}
答案 2 :(得分:3)
这是我的静态版本:
public static void playAssetSound(Context context, String soundFileName) {
try {
MediaPlayer mediaPlayer = new MediaPlayer();
AssetFileDescriptor descriptor = context.getAssets().openFd(soundFileName);
mediaPlayer.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
descriptor.close();
mediaPlayer.prepare();
mediaPlayer.setVolume(1f, 1f);
mediaPlayer.setLooping(false);
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
答案 3 :(得分:0)
修复上述播放和暂停功能
public void playBeep ( String word )
{
try
{
if ( ( m == null ) )
{
m = new MediaPlayer ();
}
else if( m != null&&lastPlayed.equalsIgnoreCase (word)){
m.stop();
m.release ();
m=null;
lastPlayed="";
return;
}else if(m != null){
m.release ();
m = new MediaPlayer ();
}
lastPlayed=word;
AssetFileDescriptor descriptor = context.getAssets ().openFd ( "rings/" + word + ".mp3" );
long start = descriptor.getStartOffset ();
long end = descriptor.getLength ();
// get title
// songTitle=songsList.get(songIndex).get("songTitle");
// set the data source
try
{
m.setDataSource ( descriptor.getFileDescriptor (), start, end );
}
catch ( Exception e )
{
Log.e ( "MUSIC SERVICE", "Error setting data source", e );
}
m.prepare ();
m.setVolume ( 1f, 1f );
// m.setLooping(true);
m.start ();
}
catch ( Exception e )
{
e.printStackTrace ();
}
}
答案 4 :(得分:-1)
开始声音
startSound("mp3/ba.mp3");
方法
private void startSound(String filename) {
AssetFileDescriptor afd = null;
try {
afd = getResources().getAssets().openFd(filename);
} catch (IOException e) {
e.printStackTrace();
}
MediaPlayer player = new MediaPlayer();
try {
assert afd != null;
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IOException e) {
e.printStackTrace();
}
try {
player.prepare();
} catch (IOException e) {
e.printStackTrace();
}
player.start();
}
答案 5 :(得分:-1)
这对我有用:
private static Android.Media.MediaPlayer mpBeep;
public static void InitSounds()
{
mpBeep = new Android.Media.MediaPlayer();
InitSound_Beep();
}
private static void InitSound_Beep()
{
Android.Content.Res.AssetFileDescriptor AFD;
AFD = eUNIS.Assets.OpenFd( "Sounds/beep-06.mp3" );
mpBeep.SetDataSource( AFD.FileDescriptor, AFD.StartOffset, AFD.Length );
AFD.Close();
mpBeep.Prepare();
mpBeep.SetVolume( 1f, 1f );
mpBeep.Looping = false;
}
public static void PlaySound_Beep()
{
if (mpBeep.IsPlaying == true)
{
mpBeep.Stop();
mpBeep.Reset();
InitSound_Beep();
}
mpBeep.Start();
}