播放资源目录中的音频文件

问题描述 投票:113回答:5

我有以下代码:

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

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

后续问题:将音频文件保存在资源目录中并将它们保存在res / raw目录中是否有区别?除了他们没有获得ID,如果他们在资产目录中的事实。如果我将音频文件移动到res / raw文件夹,那么我在重用MediaPlayers时遇到问题,因为setDataSource()没有id参数。我找不到处理这类问题的好指南。

android audio android-mediaplayer assets android-assets
5个回答
226
投票
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

如果您在资源目录中只有一个文件,那么您的版本将起作用。资产目录内容实际上不是磁盘上的“真实文件”。所有这些都是一个接一个地组合在一起。因此,如果您没有指定从哪里开始以及要读取多少字节,则播放器将读到最后(即,将继续播放assets目录中的所有文件)


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

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

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

-1
投票

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.