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 đa phương tiện bằng cách sử dụng các tiện ích của nhà cung cấp. Bạn không thể tuỳ chỉnh API MediaSession2 và MediaParser (nhưng có thể chuyển đổi các thay đổi lên trên cho API MediaPlayer
và MediaSession
cũ).
Để hỗ trợ các loại nội dung nghe nhìn bổ sung trong khung nội dung nghe nhìn Android, bạn cần tạo một trình trích xuất và trình giải mã tuỳ chỉnh. Ví dụ: để hỗ trợ thêm video Windows Media trong tệp AVI, bạn cần tạo Trình trích xuất AVI và Bộ giải mã video Windows Media.
Giới thiệu về phần mở rộng
Nếu các 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, thì bạn có thể đặt các trình bổ trợ trình trích xuất 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ụ bộ mã hoá và giải mã nội dung nghe nhìn tuỳ 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 truy cập thư viện là giao diện C2ComponentStore
. Ví dụ: tham khảo phương thức triển khai lưu trữ bộ mã hoá và giải mã 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 định cấu trúc dịch vụ bộ mã hoá và giải mã 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 quá trình dịch vụ bộ mã hoá và giải mã của nhà cung cấp bắt đầu, quá trình này có thể tải điểm truy cập cấp cao nhất này.
Tạo một công cụ trích xuất
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. 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ớ tạo mô hình trình trích xuất của bạn sau trình trích xuất có số phiên bản API cao nhất.
Đặt các công cụ trích xuất tuỳ chỉnh vào /system/lib/64/extractors
hoặc APEX của nhà cung cấp. APEX này được mở cùng với APEX của Google chứa các công cụ trích xuất của Google. Để xác minh khung đã tải trình trích xuất, hãy chạy lệnh sau.
adb shell dumpsys media.extractor
Bạn sẽ thấy danh sách các trình trích xuất 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 tuỳ chỉnh của bạn hỗ trợ một định dạng đã được công cụ trích xuất do Google cung cấp, bạn có thể buộc khung này sử dụng trình trích xuất của bạn 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 tải trình trích xuất nội dung (từ /system/lib/64/extractors
hoặc APEX của nhà cung cấp), khung nội dung đa phương tiện sẽ nhận dạng tệp và nhận thông tin về nội dung của tệp. Bước tiếp theo là thêm bộ giải mã cho định dạng để khung có thể hiểu cách phân tích cú pháp 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 tính năng hỗ trợ khung nội dung nghe nhìn cho các tệp AVI chứa MP3, bạn cần có trình trích xuất AVI nhưng không cần có bộ giải mã MP3 vì đã có sẵn bộ giải mã.
Để thêm tính năng hỗ trợ khung đa phương tiện cho các tệp AVI chứa Windows Media, bạn cần có cả trình trích xuất AVI và trình giải mã Windows Media.
Việc thêm bộ giải mã mới 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 phát hành loại MIME của các kênh nội dung nghe nhìn mà nó chứa, nhưng những bộ mã hoá và giải mã hỗ trợ các loại MIME này cần phải có mặt thì tệp mới đượ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á và giải mã (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 đa phương tiện sẽ tìm các loại tệp mới và thêm các loại tệp đó 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, trình quét cần biết về loại tệp đó. Trên Android 10 trở lên, MimeUtils
(trong libcore
) duy trì mối liên kết MIME với tiện ích. Trước đây, việc ánh xạ này được
xử lý trong tệp MediaFile.java
, tệp này tiếp tục chứa tệp ánh xạ từ
loại MIME đến các hằng số định dạng MTP.
Công cụ trích xuất có thể xuất danh sách đuôi 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).