2010-07-20 40 views
99

Tôi có đoạn mã sau:chơi tập tin âm thanh từ thư mục tài sản

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 chơi tất cả các file âm thanh trong thư mục tài sản, trong thứ tự chữ cái thay vì chỉ cần phát tệp âm thanh mà 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 nội dung không?

Câu hỏi tiếp theo: Có sự khác biệt nào giữa việc lưu tệp âm thanh trong thư mục nội dung 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 tệp âm thanh vào thư mục res/raw thì tôi gặp sự cố khi sử dụng lại MediaPlayer vì 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.

Trả lời

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

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

+1

Nó hoạt động. Cảm ơn. Nhưng tôi nghĩ rằng phiên bản của tôi NÊN cũng đã làm việc. –

+54

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 nội dung. Nội dung thư mục nội dung không thực sự là 'tệp thực' trên đĩa. Tất cả chúng được đặt lại với nhau. Vì vậy, nếu bạn không chỉ định bắt đầu từ đâu và số byte cần đọc, người chơi sẽ đọc đến cuối (tức là, sẽ tiếp tục phát tất cả các tệp trong thư mục nội dung) –

+0

Câu trả lời rất hay! – Redax

57

Chức năng này sẽ hoạt động bình thườ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(); 
    } 
} 
+2

m là gì? bạn đang khởi tạo m = new MediaPlayer(); sau và sử dụng nó trước đây? – Umar

+0

Xin chào @Umar, tôi đã biến Global MediaPlayer m = null; sau đó tôi đã gán trong playBeep() chức năng –

+0

Hãy nhớ rằng 'MediaPlayer m' phải là' static' hoặc có ** tham chiếu ** khác. Nếu bạn có 'm' trong một hàm không có tham chiếu nào,' GC' sẽ "thu thập" nó –

Các vấn đề liên quan