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.

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)


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

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

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

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

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

WWWWWWApa itu eUNIS?
Dyno Cris

eUNIS adalah kelas statis khusus dengan Aset variabel, yang mengacu pada aset aplikasi.
Altivo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.