首页 文章

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

提问于
浏览
112

我有以下代码:

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参数 . 我找不到处理这类问题的好指南 .

5 回答

  • 225
    player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
    

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

  • 2

    这个功能会正常工作:)

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

    这是我的静态版本:

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

    修复上述播放和暂停功能

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

相关问题