Tuỳ chỉnh thành phần nội dung nghe nhìn

Bạn có thể mở rộng các thành phần trình trích xuất nội dung nghe nhìn và bộ mã hoá và giải mã nội dung nghe nhìn bằng các tiện ích của nhà cung cấp. Bạn không thể tuỳ chỉnh các API MediaSession2 và MediaParser (nhưng bạn có thể truyền các thay đổi cho các API MediaPlayerMediaSession cũ).

Để hỗ trợ các loại nội dung nghe nhìn khác trong khung nội dung nghe nhìn Android, bạn cần tạo một trình trích xuấttrình giải mã tuỳ chỉnh. Ví dụ: để thêm tính năng hỗ trợ video Windows Media trong tệp AVI, bạn cần tạo một Trình trích xuất AVI và một Trình giải mã video Windows Media.

Giới thiệu về tiện ích

Nếu trình trích xuất nội dung nghe nhìn mặc định không đáp ứng yêu cầu của bạn, bạn có thể đặt các trình trích xuất bổ trợ tuỳ chỉnh trong /system/lib[64]/extractors/. Quy trình trích xuất sẽ tự động tải các trình bổ trợ 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 đa phương tiện tuỳ chỉnh sử dụng giao diện Codec 2.0 được xác định trong frameworks/av/media/codec2/core/. Để biết cách triển khai cơ bản, hãy tham khảo frameworks/av/media/codec2/hidl/services/. Điểm truy cập thư viện là giao diện C2ComponentStore. Để xem ví dụ, hãy tham khảo quá trình triển khai kho 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 một thư viện dùng chung 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 (có các phần phụ thuộc bắc cầu) nằm trong phân vùng của nhà cung cấp. Khi quy trình dịch vụ codec của nhà cung cấp bắt đầu, quy trình này có thể tải điểm truy cập cấp cao nhất này.

Tạo một trình trích xuất

Khi thêm một trình trích xuất cho một định dạng mới, hãy đảm bảo rằng 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. Trình trích xuất phải triển khai API do frameworks/av/include/media/MediaExtractorPluginApi.h xác định 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 nhớ mô hình hoá trình trích xuất của bạn theo trình trích xuất có số phiên bản API cao nhất.

Đặt trình trích xuất tuỳ chỉnh trong /system/lib/64/extractors hoặc APEX của nhà cung cấp. APEX này sẽ mở cùng với APEX của Google chứa trình trích xuất của Google. Để xác minh rằng khung đã tải trình trích xuất 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 trích xuất có sẵn, tương tự như danh sách 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 tuỳ chỉnh của bạn hỗ trợ một định dạng mà trình trích xuất do Google cung cấp đã hỗ trợ, bạn có thể buộc khung 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 mức độ do Google cung cấp.

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

Tạo bộ giải mã tuỳ chỉnh

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

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

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

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

Mặc dù trình trích xuất xuất bản loại MIME của các bản âm thanh và phụ đề mà nó chứa, nhưng các bộ mã hoá và giải mã hỗ trợ những loại MIME này cần phải có để tệp được hỗ trợ đầy đủ. Chuỗi loại MIME thực tế được sử dụng hoàn toàn là thoả thuận giữa trình trích xuất và bộ mã hoá/giải mã (bạn không cần thêm chuỗi này vào tệp MediaDefs.h).

Tích hợp với trình quét nội dung nghe nhìn

Trình quét nội dung nghe nhìn sẽ tìm các loại tệp mới và thêm chúng vào cơ sở dữ liệu nội dung nghe nhìn. Để trình quét nội dung nghe nhìn xử lý loại tệp tuỳ chỉnh của bạn, trình quét cần biết về loại tệp đó. Trong Android 10 trở lên, MimeUtils (trong libcore) duy trì mối liên kết giữa MIME và phần mở rộng. Trước đây, hoạt động liên kết này được xử lý trong tệp MediaFile.java, tệp này vẫn chứa hoạt động liên kết từ loại MIME đến các hằng số định dạng MTP.

Trình trích xuất có thể xuất danh sách các đuôi tên tệp mà trình trích xuất đó hỗ trợ (chẳng hạn như MP3 hoặc MP4). Tuy nhiên, chỉ LegacyMediaScanner sử dụng tuỳ chọn đó; tuỳ chọn này không ảnh hưởng đến ModernMediaScanner (được dùng theo mặc định).