Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Tùy chỉnh các thành phần phương tiện

Bạn có thể mở rộng trình trích xuất phương tiện và các thành phần codec phương tiện bằng cách sử dụng tiện ích mở rộng của nhà cung cấp. Không thể tùy chỉnh các API MediaSession2 và MediaParser (nhưng bạn có thể ngược dòng các thay đổi cho các API MediaPlayerMediaSession kế thừa).

Để hỗ trợ các loại phương tiện bổ sung trong khuôn khổ phương tiện Android, bạn cần tạo một trình trích xuấtgiải mã tùy chỉnh. Ví dụ: để thêm hỗ trợ cho video Windows Media trong các tệp AVI, bạn cần tạo Bộ giải nén AVIBộ giải mã video Windows Media.

Giới thiệu về tiện ích mở rộng

Nếu trình giải nén phương tiện mặc định không đáp ứng yêu cầu của bạn, bạn có thể đặt các plugin trình trích xuất tùy chỉnh trong /system/lib[64]/extractors/ . Quy trình giải nén tự động tải các plugin trình trích xuất từ ​​gói APEX do Google cung cấp và từ /system/lib[64]/extractors/ .

Tương tự, bạn có thể thiết lập các dịch vụ codec phương tiện tùy chỉnh sử dụng giao diện Codec 2.0 được xác định trong frameworks/av/media/codec2/core/ . Để triển khai cơ bản, hãy tham khảo frameworks/av/media/codec2/hidl/services/ . Điểm vào thư viện là giao diện C2ComponentStore . Ví dụ: hãy tham khảo triển khai cửa hàng codec phần mềm mặc định tại frameworks/av/media/codec2/vndk/C2Store.cpp .

Khi sử dụng APEX của riêng bạn, hãy cấu trúc dịch vụ codec và tải tệp APEX bằng các quy trình tương tự như dịch vụ mediaswcodec . Để làm như vậy, hãy xác định thư viện chia sẻ cấp cao nhất chịu trách nhiệm đăng ký tất cả các thành phần C2, sau đó tạo một gói APEX (với các phụ thuộc bắc cầu) nằm trong phân vùng của nhà cung cấp. Khi quá trình dịch vụ codec của nhà cung cấp bắt đầu, nó có thể tải điểm nhập cấp cao nhất này.

Tạo một bộ giải nén

Khi thêm trình trích xuất cho một định dạng mới, hãy đảm bảo trình trích xuất chỉ phụ thuộc vào các API NDK ổn định và không phụ thuộc vào bất kỳ API riêng tư nào. Các trình trích xuất phải triển khai API được xác định bởi các frameworks/av/include/media/MediaExtractorPluginApi.h và có thể sử dụng trình bao bọc tiện lợi C ++ trong frameworks/av/include/media/MediaExtractorPluginHelper.h . Vì Android 10 trở lên chỉ hỗ trợ phiên bản cao nhất của API trình trích xuất, hãy đảm bảo tạo mô hình trình trích xuất của bạn sau trình giải nén có số phiên bản API cao nhất.

Đặt các trình trích xuất tùy chỉnh vào /system/lib/64/extractors hoặc APEX của nhà cung cấp, được mở cùng với Google APEX chứa các trình trích xuất của Google. Để xác minh khung đã tải trình giải nén của bạn, hãy chạy lệnh sau.

adb shell dumpsys media.extractor

Bạn sẽ nhận được danh sách các trình giải nén có sẵn tương tự như sau.

Available extractors:
AAC Extractor: plugin\_version(2), uuid(4fd80eae03d24d729eb948fa6bb54613), version(1), path(/system/lib64/extractors/libaacextractor.so)
AMR Extractor: plugin\_version(2), uuid(c86639c92f3140aca715fa01b4493aaf), version(1), path(/system/lib64/extractors/libamrextractor.so)
FLAC Extractor: plugin\_version(2), uuid(1364b048cc454fda9934327d0ebf9829), version(1), path(/system/lib64/extractors/libflacextractor.so)
MIDI Extractor: plugin\_version(2), uuid(ef6cca0af8a243e6ba5fdfcd7c9a7ef2), version(1), path(/system/lib64/extractors/libmidiextractor.so)
MP3 Extractor: plugin\_version(2), uuid(812a3f6cc8cf46deb5293774b14103d4), version(1), path(/system/lib64/extractors/libmp3extractor.so)
MP4 Extractor: plugin\_version(2), uuid(27575c6744174c548d3d8e626985a164), version(2), path(/system/lib64/extractors/libmp4extractor.so)
MPEG2-PS/TS Extractor: plugin\_version(1), uuid(3d1dcfebe40a436da574c2438a555e5f), version(1), path(/system/lib64/extractors/libmpeg2extractor.so)
Matroska Extractor: plugin\_version(2), uuid(abbedd9238c44904a4c1b3f45f899980), version(1), path(/system/lib64/extractors/libmkvextractor.so)
Ogg Extractor: plugin\_version(2), uuid(8cc5cd06f772495e8a62cba9649374e9), version(1), path(/system/lib64/extractors/liboggextractor.so)
WAV Extractor: plugin\_version(3), uuid(7d61385858374a3884c5332d1cddee27), version(1), path(/system/lib64/extractors/libwavextractor.so)

Nếu trình trích xuất tùy chỉnh của bạn hỗ trợ định dạng đã được hỗ trợ bởi trình trích xuất do Google cung cấp, bạn có thể buộc khuôn khổ sử dụng trình trích xuất của mình bằng cách sử dụng hàm Sniff() để trả về mức độ tin cậy cao hơn định dạng do Google cung cấp.

Khi khung phương tiện tải trình giải nén của bạn (từ /system/lib/64/extractors hoặc từ APEX của nhà cung cấp), nó sẽ nhận dạng tệp và nhận thông tin về nội dung của nó. Bước tiếp theo là thêm bộ giải mã cho định dạng để khuôn khổ có thể hiểu cách phân tích cú pháp nội dung tệp.

Tạo bộ giải mã tùy chỉnh

Bạn cần một bộ giải mã tùy chỉnh cho bất kỳ định dạng nào chưa được hỗ trợ bởi bộ giải mã do Google cung cấp. Ví dụ:

  • Để thêm hỗ trợ khung phương tiện cho các tệp AVI có chứa MP3, bạn cần một bộ giải nén AVI nhưng không cần một bộ giải mã MP3 vì một bộ giải mã này đã tồn tại.

  • Để thêm hỗ trợ khung phương tiện cho các tệp AVI chứa Windows Media, bạn cần cả trình mở rộng AVI và trình giải mã Windows Media.

Thêm bộ giải mã mới tương tự như thêm bộ giải mã phần cứng của riêng bạn cho AVC hoặc HEVC.

Trong khi trình giải nén xuất bản loại MIME của các bản nhạc phương tiện mà nó chứa, các codec hỗ trợ các loại MIME này cần phải có để tệp được hỗ trợ đầy đủ. Chuỗi kiểu MIME thực tế được sử dụng hoàn toàn là thỏa thuận giữa trình giải nén và codec (chuỗi không cần thêm vào tệp MediaDefs.h ).

Tích hợp với máy quét phương tiện

Trình quét phương tiện tìm kiếm các loại tệp mới và thêm chúng vào cơ sở dữ liệu phương tiện. Để máy quét phương tiện xử lý loại tệp tùy chỉnh của bạn, máy quét cần biết về nó. Trong Android 10 trở lên, MimeUtils (trong libcore ) duy trì ánh xạ MIME-to-extension. Trước đây, ánh xạ này đã được xử lý trong tệp MediaFile.java , tệp này tiếp tục chứa ánh xạ từ kiểu MIME sang hằng số định dạng MTP.

Trình giải nén có thể xuất danh sách các phần mở rộng tên tệp mà chúng hỗ trợ (chẳng hạn như MP3 hoặc MP4). Tuy nhiên, chỉ LegacyMediaScanner sử dụng điều đó; nó không ảnh hưởng đến ModernMediaScanner , được sử dụng theo mặc định.