Putar file audio dari direktori aset

126

Saya memiliki kode berikut:

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

Masalahnya adalah, ketika saya menjalankan kode ini, ia mulai memutar semua file audio di direktori aset, dalam urutan abjad, bukan hanya memutar file audio yang saya minta. Apa yang saya lakukan salah? Apakah ada cara yang lebih baik untuk memutar file audio dari direktori aset?

Pertanyaan tindak lanjut: Apakah ada perbedaan antara menyimpan file audio di direktori aset dan menyimpannya di direktori res / raw? Selain fakta bahwa mereka tidak mendapatkan id jika berada di direktori aset. Jika saya memindahkan file audio ke folder res / raw maka saya memiliki masalah dengan menggunakan kembali MediaPlayers karena tidak ada parameter id untuk setDataSource(). Saya tidak dapat menemukan pedoman yang baik untuk menangani masalah seperti ini.

Catalin Morosan
sumber

Jawaban:

237
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());

Versi Anda akan berfungsi jika Anda hanya memiliki satu file di direktori aset. Isi direktori aset sebenarnya bukan 'file nyata' pada disk. Semuanya disatukan satu demi satu. Jadi, jika Anda tidak menentukan di mana harus memulai dan berapa byte yang harus dibaca, pemain akan membaca sampai akhir (yaitu, akan terus memainkan semua file di direktori aset)

Sarwar Erfan
sumber
1
Berhasil. Terima kasih. Tapi saya pikir versi saya HARUS juga berfungsi.
Catalin Morosan
57
Versi Anda akan berfungsi jika Anda hanya memiliki satu file di direktori aset. Isi direktori aset sebenarnya bukan 'file nyata' pada disk. Semuanya disatukan satu demi satu. Jadi, jika Anda tidak menentukan di mana harus memulai dan berapa byte yang akan dibaca, pemain akan membaca sampai akhir (yaitu, akan terus memainkan semua file di direktori aset)
Sarwar Erfan
1
Ini adalah jalur kode yang saya gunakan tetapi tidak berhasil: stackoverflow.com/questions/9124378/…
Timothy Lee Russell
1
1 untuk menjawab pertanyaan saya yang sama sekali tidak terkait tentang file aset!
jjm
Pikiran @SarwarErfan tertiup oleh implementasi direktori aset> _ <
Warpzit
74

Fungsi ini akan bekerja dengan baik :)

// 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();
    }
}
Siddhpura Amit
sumber
3
apa m? Anda menginisialisasi m = new MediaPlayer (); setelah dan menggunakannya sebelumnya?
Umer
Hai @Umar, saya telah menggunakan variabel Global MediaPlayer m = null; maka saya telah menetapkan fungsi playBeep ()
Siddhpura Amit
Perlu diingat MediaPlayer mpasti ada staticatau punya referensi lain . Jika Anda memiliki mfungsi tanpa referensi apa pun, GCakan "mengumpulkan" itu
Menelaos Kotsollaris
terkadang audio tidak diputar sampai akhir
pengguna7856586
looping to true apakah itu selamanya bermain?
gumuruh
4

Berikut versi statis saya:

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

Perbaiki fungsi di atas untuk putar dan jeda

  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 ();
    }
}
Grafik Hadid
sumber
1

masukkan deskripsi gambar di sini

mulai suara

startSound("mp3/ba.mp3");

metode

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

ini bekerja untuk saya:

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

Dalam aktivitas utama, saat membuat:

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

cara menggunakan dalam kode (saat klik tombol):

private void bButton_Click( object sender, EventArgs e )
{
  eSound_Def.PlaySound_Beep();
}
Altivo
sumber
WWWWWWApa itu eUNIS?
Dyno Cris
eUNIS adalah kelas statis khusus dengan Aset variabel, yang mengacu pada aset aplikasi.
Altivo