Varlıklar dizininden ses dosyasını oynatın


126

Takip koduna sahibim:

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

Sorun şu ki, bu kodu çalıştırdığımda, sadece istediğim ses dosyasını çalmak yerine varlıklar dizinindeki tüm ses dosyalarını alfabetik sırayla çalmaya başlıyor. Neyi yanlış yapıyorum? Varlıklar dizininden ses dosyalarını çalmanın daha iyi bir yolu var mı?

Takip eden soru: Ses dosyalarını varlıklar dizininde tutmakla res / raw dizininde tutmak arasında bir fark var mı? Varlıklar dizinindeyken kimlik almamaları gerçeğinin yanı sıra. Ses dosyalarını res / raw klasörüne taşırsam, MediaPlayers'yi yeniden kullanırken sorun yaşarım çünkü için id parametresi yok setDataSource(). Bu tür sorunların üstesinden gelmek için iyi bir kılavuz bulamıyorum.

Yanıtlar:


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

Varlıklar dizininde yalnızca bir dosyanız olsaydı sürümünüz çalışırdı. Varlık dizini içeriği aslında diskteki 'gerçek dosyalar' değildir. Hepsi birbiri ardına bir araya getirilir. Bu nedenle, nereden başlayacağınızı ve kaç bayt okuyacağınızı belirtmezseniz, oynatıcı sonuna kadar okuyacaktır (yani, varlıklar dizinindeki tüm dosyaları oynatmaya devam edecektir)


1
İşe yaradı. Teşekkürler. Ama bence benim versiyonum da işe yaramalı.
Catalin Morosan

57
Varlıklar dizininde yalnızca bir dosyanız olsaydı sürümünüz çalışırdı. Varlık dizini içeriği aslında diskteki 'gerçek dosyalar' değildir. Hepsi birbiri ardına bir araya getirilir. Yani, nereden başlayacağınızı ve kaç bayt okuyacağınızı belirtmezseniz, oynatıcı sonuna kadar okuyacaktır (yani, varlıklar dizinindeki tüm dosyaları oynatmaya devam edecektir)
Sarwar Erfan

1
Kullandığım kod yolu bu ama çalışmıyor: stackoverflow.com/questions/9124378/…
Timothy Lee Russell

1
Varlık dosyalarıyla ilgili tamamen ilgisiz bir soruyu yanıtladığım için +1!
jjm

@SarwarErfan, varlıklar dizininin uygulanmasıyla aklını başından aldı> _ <
Warpzit

74

Bu işlev düzgün çalışacaktır :)

// 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
m nedir m = new MediaPlayer () 'ı başlatıyorsunuz; sonra ve daha önce kullandın mı?
Umer

Merhaba @Umar, Global değişken MediaPlayer m = null aldım; sonra playBeep () işlevini
atadım

Başka bir referansMediaPlayer m olması staticveya olması gerektiğini unutmayın . Herhangi bir referans olmadan bir işleviniz varsa , onu "toplayacak"mGC
Menelaos Kotsollaris

bazen ses sonuna kadar
çalmıyor

doğruya döngü sonsuza kadar mı oynuyor?
gumuruh

4

İşte statik versiyonum:

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

Oynatma ve duraklatma için yukarıdaki fonksiyonun düzeltilmesi

  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

görüntü açıklamasını buraya girin

sesi başlat

startSound("mp3/ba.mp3");

yöntem

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

bu benim için çalışıyor:

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

Ana aktivitede, oluşturmada:

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

kodda nasıl kullanılır (düğme tıklandığında):

private void bButton_Click( object sender, EventArgs e )
{
  eSound_Def.PlaySound_Beep();
}

WWWWEUNIS nedir?
Dyno Cris

eUNIS, uygulama varlıklarına referans olan değişken Varlıklara sahip özel statik sınıftır.
Altivo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.