web-dev-qa-db-ja.com

アセットディレクトリからオーディオファイルを再生する

私は次のコードを持っています:

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

問題は、このコードを実行すると、要求したオーディオファイルを再生するだけでなく、アセットディレクトリ内のすべてのオーディオファイルをアルファベット順に再生し始めることです。私は何を間違えていますか?アセットディレクトリからオーディオファイルを再生するより良い方法はありますか?

追加の質問:アセットディレクトリにオーディオファイルを保持することとres/rawディレクトリに保持することには違いがありますか?それらがassetsディレクトリにある場合、IDを取得しないという事実に加えて。オーディオファイルをres/rawフォルダーに移動すると、setDataSource()のidパラメーターがないため、MediaPlayersの再利用に問題があります。この種の問題を処理するための良いガイドラインが見つかりません。

115
Catalin Morosan
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

アセットディレクトリにファイルが1つしかない場合、バージョンは機能します。アセットディレクトリの内容は、実際にはディスク上の「実際のファイル」ではありません。それらはすべて次々にまとめられます。したがって、開始する場所と読み取るバイト数を指定しない場合、プレーヤーは最後まで読み取ります(つまり、assetsディレクトリ内のすべてのファイルを再生し続けます)

226
Sarwar Erfan

この関数は適切に動作します:)

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

ここに私の静的バージョン:

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
Alecs

再生と一時停止に関する上記の機能の修正

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