Phát tệp âm thanh từ thư mục tài sản


126

Tôi có đoạn mã sau:

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

Vấn đề là, khi tôi chạy mã này, nó bắt đầu phát tất cả các tệp âm thanh trong thư mục tài sản, theo thứ tự bảng chữ cái thay vì chỉ phát tệp âm thanh tôi yêu cầu. Tôi đang làm gì sai? Có cách nào tốt hơn để phát tệp âm thanh từ thư mục tài sản không?

Câu hỏi tiếp theo: Có sự khác biệt giữa việc giữ các tệp âm thanh trong thư mục tài sản và giữ chúng trong thư mục res / raw không? Bên cạnh thực tế là họ không nhận được id nếu họ đang ở trong thư mục tài sản. Nếu tôi di chuyển các tệp âm thanh vào thư mục res / raw thì tôi gặp vấn đề với việc sử dụng lại MediaPlayervì không có tham số id cho setDataSource(). Tôi không thể tìm thấy một hướng dẫn tốt để xử lý loại vấn đề này.

Câu trả lời:


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

Phiên bản của bạn sẽ hoạt động nếu bạn chỉ có một tệp trong thư mục tài sản. Nội dung thư mục tài sản không thực sự là 'tệp thực' trên đĩa. Tất cả chúng được đặt cùng nhau. Vì vậy, nếu bạn không chỉ định bắt đầu từ đâu và đọc bao nhiêu byte, trình phát sẽ đọc đến hết (nghĩa là sẽ tiếp tục phát tất cả các tệp trong thư mục tài sản)


1
Nó đã làm việc. Cảm ơn. Nhưng tôi nghĩ phiên bản của tôi NÊN cũng đã làm việc.
Catalin Morosan

57
Phiên bản của bạn sẽ hoạt động nếu bạn chỉ có một tệp trong thư mục tài sản. Nội dung thư mục tài sản không thực sự là 'tệp thực' trên đĩa. Tất cả chúng được đặt cùng nhau. Vì vậy, nếu bạn không chỉ định bắt đầu từ đâu và đọc bao nhiêu byte, trình phát sẽ đọc đến hết (nghĩa là sẽ tiếp tục phát tất cả các tệp trong thư mục tài sản)
Sarwar Erfan

1
Đây là đường dẫn mã mà tôi đang sử dụng nhưng nó không hoạt động: stackoverflow.com/questions/9124378/iêu
Timothy Lee Russell

1
+1 để trả lời một câu hỏi hoàn toàn không liên quan tôi có về các tệp tài sản!
jjm

Tâm trí @SarwarErfan bị thổi bay bởi việc triển khai thư mục tài sản> _ <
Warpzit

74

Chức năng này sẽ hoạt động đúng :)

// 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 là gì? bạn đang khởi tạo m = new MediaPlayer (); sau và sử dụng nó trước?
Umer

Xin chào @Umar, tôi đã lấy Biến toàn cầu MediaPlayer m = null; sau đó tôi đã gán trong hàm playBeep ()
Siddhpura Amit

Hãy ghi nhớ MediaPlayer mphải statichoặc có một tài liệu tham khảo khác . Nếu bạn có mchức năng mà không có bất kỳ tham chiếu nào, GCsẽ "thu thập" nó
Menelaos Kotsollaris 20/03/2015

đôi khi âm thanh không phát đến hết
user7856586

lặp đi lặp lại thành sự thật là chơi mãi mãi?
gumuruh

4

Đây là phiên bản tĩnh của tôi:

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

Sửa lỗi chức năng trên để chơi và tạm dừng

  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

nhập mô tả hình ảnh ở đây

bắt đầu âm thanh

startSound("mp3/ba.mp3");

phương pháp

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

cái này hiệu quả với tôi

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

Trong hoạt động chính, trên tạo:

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

Làm thế nào để sử dụng trong mã (bấm vào nút):

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

WWWWWWUN là gì?
Dyno Cris

eUNIS là lớp tĩnh tùy chỉnh với Tài sản thay đổi, tham chiếu đến tài sản ứng dụng.
Altivo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.