khác

Tổng quan về MediaPlayer


Khung đa phương tiện Android bao gồm hỗ trợ phát nhiều loại phương tiện phổ biến, để bạn có thể dễ dàng tích hợp âm thanh, video và hình ảnh vào các ứng dụng của mình. Bạn có thể phát âm thanh hoặc video từ các tệp phương tiện được lưu trữ trong tài nguyên của ứng dụng (tài nguyên thô), từ các tệp độc lập trong hệ thống tệp hoặc từ luồng dữ liệu đến qua kết nối mạng, tất cả đều sử dụng API MediaPlayer.

Tài liệu này hướng dẫn bạn cách sử dụng MediaPlayer để viết một ứng dụng phát phương tiện tương tác với người dùng và hệ thống nhằm đạt được hiệu suất tốt và trải nghiệm người dùng thú vị. Ngoài ra, bạn có thể muốn sử dụng ExoPlayer, đây là một thư viện mã nguồn mở có thể tùy chỉnh hỗ trợ các tính năng hiệu suất cao không có trong MediaPlayer

Lưu ý: Bạn chỉ có thể phát lại dữ liệu âm thanh tới thiết bị đầu ra tiêu chuẩn. Hiện tại, đó là loa của thiết bị di động hoặc tai nghe Bluetooth. Bạn không thể phát các tệp âm thanh trong âm thanh cuộc hội thoại trong khi gọi.

Những thứ cơ bản
Các lớp sau được sử dụng để phát âm thanh và video trong Android framework:

Media Player
Lớp này là API chính để phát âm thanh và video.
AudioManager
Lớp này quản lý các nguồn âm thanh và đầu ra âm thanh trên một thiết bị.
Khai báo Manifest
Trước khi bắt đầu phát triển ứng dụng của bạn bằng MediaPlayer, hãy đảm bảo rằng tệp kê khai của bạn có các khai báo thích hợp để cho phép sử dụng các tính năng liên quan.

Quyền truy cập Internet – Nếu bạn đang sử dụng MediaPlayer để phát trực tuyến nội dung dựa trên mạng, ứng dụng của bạn phải yêu cầu quyền truy cập mạng.


Wake Lock Permission – Nếu ứng dụng trình phát của bạn cần giữ cho màn hình không bị mờ hoặc bộ xử lý không ở chế độ ngủ hoặc sử dụng phương thức MediaPlayer.setScreenOnWhilePlaying () hoặc MediaPlayer.setWakeMode (), bạn phải yêu cầu quyền này.


Sử dụng MediaPlayer
Một trong những thành phần quan trọng nhất của media framework là lớp MediaPlayer. Một đối tượng của lớp này có thể tìm nạp, giải mã và phát cả âm thanh và video với thiết lập tối thiểu. Nó hỗ trợ một số nguồn phương tiện khác nhau như:

Tài nguyên địa phương
URI nội bộ, chẳng hạn như URI mà bạn có thể lấy từ Trình phân giải nội dung
URL bên ngoài (phát trực tuyến)
Để biết danh sách các định dạng phương tiện mà Android hỗ trợ, hãy xem trang Định dạng phương tiện được hỗ trợ.

Dưới đây là một ví dụ về cách phát âm thanh có sẵn dưới dạng tài nguyên thô cục bộ (được lưu trong thư mục res / raw / của ứng dụng của bạn):

Kotlin
Java

MediaPlayer mediaPlayer = MediaPlayer.create (context, R.raw.sound_file_1);
mediaPlayer.start (); // không cần gọi chuẩn bị (); create () làm điều đó cho bạn
Trong trường hợp này, tài nguyên “thô” là một tệp mà hệ thống không cố gắng phân tích cú pháp theo bất kỳ cách cụ thể nào. Tuy nhiên, nội dung của tài nguyên này không được là âm thanh thô. Nó phải là một tệp phương tiện được mã hóa và định dạng đúng theo một trong các định dạng được hỗ trợ.

Và đây là cách bạn có thể phát từ một URI có sẵn cục bộ trong hệ thống (ví dụ: bạn lấy được thông qua Trình phân giải nội dung):

Kotlin
Java

Uri myUri = ….; // khởi tạo Uri tại đây
MediaPlayer mediaPlayer = new MediaPlayer ();
mediaPlayer.setAudioAttributes (
mới AudioAttributes.Builder ()
.setContentType (AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage (AudioAttributes.USAGE_MEDIA)
.xây dựng()
);
mediaPlayer.setDataSource (getApplicationContext (), myUri);
mediaPlayer.prepare ();
mediaPlayer.start ();
Phát từ một URL từ xa thông qua truyền trực tuyến HTTP trông như thế này:

Kotlin
Java

Chuỗi url = “http: // ……..”; // URL của bạn ở đây
MediaPlayer mediaPlayer = new MediaPlayer ();
mediaPlayer.setAudioAttributes (
mới AudioAttributes.Builder ()
.setContentType (AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage (AudioAttributes.USAGE_MEDIA)
.xây dựng()
);
mediaPlayer.setDataSource (url);
mediaPlayer.prepare (); // có thể mất nhiều thời gian! (để đệm, v.v.)
mediaPlayer.start ();
Lưu ý: Nếu bạn đang chuyển một URL để phát trực tuyến tệp phương tiện trực tuyến, tệp đó phải có khả năng tải xuống liên tục.

Thận trọng: Bạn phải bắt hoặc chuyển IllegalArgumentException và IOException khi sử dụng setDataSource (), vì tệp bạn đang tham chiếu có thể không tồn tại.

Chuẩn bị không đồng bộ
Về nguyên tắc, việc sử dụng MediaPlayer có thể đơn giản. Tuy nhiên, điều quan trọng cần lưu ý là cần phải có thêm một số điều để tích hợp nó một cách chính xác với một ứng dụng Android điển hình. Ví dụ: lệnh gọi chuẩn bị () có thể mất nhiều thời gian để thực thi, vì nó có thể liên quan đến việc tìm nạp và giải mã dữ liệu phương tiện. Vì vậy, như trường hợp của bất kỳ phương thức nào có thể mất nhiều thời gian để thực thi, bạn không nên gọi nó từ chuỗi giao diện người dùng của ứng dụng của mình. Việc làm đó khiến giao diện người dùng bị treo cho đến khi phương thức trả về, đây là một trải nghiệm người dùng rất tệ và có thể gây ra lỗi ANR (Ứng dụng không phản hồi). Ngay cả khi bạn mong đợi tài nguyên của mình tải nhanh, hãy nhớ rằng bất kỳ thứ gì mất hơn một phần mười giây để phản hồi trong giao diện người dùng đều gây ra sự tạm dừng đáng chú ý và khiến người dùng có ấn tượng rằng ứng dụng của bạn chạy chậm.

Để tránh treo chuỗi giao diện người dùng của bạn, hãy tạo một chuỗi khác để chuẩn bị MediaPlayer và thông báo cho chuỗi chính khi hoàn tất. Tuy nhiên, mặc dù bạn có thể tự viết logic phân luồng, nhưng mẫu này rất phổ biến khi sử dụng MediaPlayer đến nỗi khung công tác cung cấp một cách thuận tiện để thực hiện tác vụ này bằng cách sử dụng phương thức readyAsync (). Phương thức này bắt đầu chuẩn bị phương tiện ở chế độ nền và trả về ngay lập tức. Khi phương tiện được chuẩn bị xong, phương thức onPrepared () của MediaPlayer.OnPreparedListener, được cấu hình thông qua setOnPreparedListener () được gọi.

Quản lý trạng thái
Một khía cạnh khác của MediaPlayer mà bạn cần lưu ý là nó dựa trên trạng thái. Đó là, MediaPlayer có trạng thái bên trong

About the author

lbtmicr06

Leave a Comment

Translate »