从资产目录播放音频文件

我有以下密码:

AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();

问题是,当我运行这段代码时,它开始以字母顺序播放资产目录中的所有音频文件,而不是只播放我请求的音频文件。我做错了什么?是否有更好的方法从资产目录播放音频文件?

后续问题: 在资产目录中保存音频文件和在 res/raw 目录中保存音频文件是否有区别?除此之外,如果他们在资产目录中,他们就得不到 ID。如果我将音频文件移动到 res/raw 文件夹,那么在重用 MediaPlayer时就会出现问题,因为没有 setDataSource()的 id 参数。我找不到一个处理这类问题的好指南。

115917 次浏览
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

如果资产中只有一个文件,那么您的版本就可以工作 资产目录的内容实际上并不是“真正的文件” 所有这些都是一个接一个地放在一起的。所以,如果你 如果不指定从哪里开始以及读取多少字节,播放器将 读到最后(也就是说,将继续播放资产中的所有文件) 目录)

这个函数将正常工作:)

// 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();
}
}

修正了上面的播放和暂停功能

  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 ();
}
}

这是我的静态版本:

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();
}
}

enter image description here

开始录音

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();
}

这对我有用:

public static class eSound_Def
{
private static Android.Media.MediaPlayer mpBeep;


public static void InitSounds( Android.Content.Res.AssetManager Assets )
{
mpBeep = new Android.Media.MediaPlayer();


InitSound_Beep( Assets );
}


private static void InitSound_Beep( Android.Content.Res.AssetManager Assets )
{
Android.Content.Res.AssetFileDescriptor AFD;


AFD = 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();
}
}

在主要活动中,创作:

protected override void OnCreate( Bundle savedInstanceState )
{
base.OnCreate( savedInstanceState );
SetContentView( Resource.Layout.lmain_activity );
...
eSound_Def.InitSounds( Assets );
...
}

如何在代码中使用(单击按钮) :

private void bButton_Click( object sender, EventArgs e )
{
eSound_Def.PlaySound_Beep();
}