代码之家  ›  专栏  ›  技术社区  ›  Catalin Morosan

从资产目录播放音频文件

  •  112
  • Catalin Morosan  · 技术社区  · 14 年前

    我有以下代码:

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

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

    后续问题: 在资产目录中保存音频文件和在res/raw目录中保存音频文件之间有区别吗?此外,如果它们在assets目录中,则不会获得ID。如果我将音频文件移动到res/raw文件夹中,那么重用时会出现问题。 MediaPlayer 因为没有ID参数 setDataSource() . 我找不到处理这种问题的好指南。

    5 回复  |  直到 6 年前
        1
  •  225
  •   Dheeraj Bhaskar    12 年前
    player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
    

    如果资产中只有一个文件,则您的版本可以工作 目录。资产目录内容实际上不是“真实文件” 在磁盘上。它们一个接一个地组合在一起。所以,如果你这样做 不指定起始位置和读取的字节数,播放机将 一直读到最后(即将继续播放资产中的所有文件) 目录)

        2
  •  66
  •   JWL    8 年前

    此功能将正常工作:)

    // 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
  •  2
  •   Alecs    6 年前

    这里是我的静态版本:

    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();
        }
    }
    
        4
  •  0
  •   Mohammad Zaer    6 年前

    上述播放和暂停功能的修复

      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 ();
        }
    }
    
        5
  •  -1
  •   MODERN    6 年前

    开始声音

    startsound(“mp3/ba.mp3”);
    < /代码> 
    
    

    方法

    private void startsound(字符串文件名){
    assetfileDescriptor afd=空;
    尝试{
    afd=getresources().getassets().openfd(文件名);
    }捕获(IOException E){
    e.printstacktrace();
    }
    mediaplayer player=new mediaplayer();
    尝试{
    断言AFD!= NULL;
    player.setdatasource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
    }捕获(IOException E){
    e.printstacktrace();
    }
    尝试{
    player.prepare();
    }捕获(IOException E){
    e.printstacktrace();
    }
    播放器。
    }
    < /代码> 
    

    启动声音

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