공급업체 확장 프로그램을 사용하여 미디어 추출기 및 미디어 코덱 구성요소를 확장할 수 있습니다. MediaSession2 및 MediaParser API는 맞춤설정할 수 없지만, 기존 MediaPlayer
및 MediaSession
API의 변경사항은 업스트림할 수 있습니다.
Android 미디어 프레임워크에서 추가 미디어 유형을 지원하려면 맞춤 추출기 및 디코더를 만들어야 합니다. 예를 들어 AVI 파일의 Windows Media 동영상 지원을 추가하려면 AVI 추출기 및 Windows Media 동영상 디코더를 만들어야 합니다.
확장 프로그램 정보
기본 미디어 추출기가 요구사항을 충족하지 않으면 /system/lib[64]/extractors/
에 맞춤 추출기 플러그인을 배치할 수 있습니다. 추출기 프로세스는 Google이 제공하는 APEX 패키지와 /system/lib[64]/extractors/
에서 추출기 플러그인을 자동으로 로드합니다.
마찬가지로 frameworks/av/media/codec2/core/
에 정의된 Codec 2.0 인터페이스를 사용하는 맞춤 미디어 코덱 서비스를 설정할 수 있습니다. 기본 구현은 frameworks/av/media/codec2/hidl/services/
를 참고하세요. 라이브러리 진입점은 C2ComponentStore
인터페이스입니다. frameworks/av/media/codec2/vndk/C2Store.cpp
의 기본 소프트웨어 코덱 저장소 구현 예를 참고하세요.
자체 APEX를 사용할 때는 코덱 서비스를 구성하고 mediaswcodec
서비스와 동일한 프로세스를 사용하여 APEX 파일을 로드합니다. 이렇게 하려면 모든 C2 구성요소 등록을 담당하는 최상위 공유 라이브러리를 정의한 다음 공급업체 파티션에 상주하는 APEX 패키지(전이 종속 항목 사용)를 만듭니다. 그런 다음 공급업체 코덱 서비스 프로세스가 시작하면 이 최상위 진입점을 로드할 수 있습니다.
추출기 만들기
새 형식의 추출기를 추가할 때는 추출기가 안정적인 NDK API에만 종속되고 비공개 API에는 종속되지 않도록 하세요. 추출기는 frameworks/av/include/media/MediaExtractorPluginApi.h
에서 정의한 API를 구현해야 하며 frameworks/av/include/media/MediaExtractorPluginHelper.h
에서 C++ 편의 래퍼를 사용할 수 있습니다. Android 10 이상에서는 추출기 API의 가장 높은 버전만 지원하므로 추출기 이후에 가장 높은 API 버전 번호로 추출기를 모델링해야 합니다.
/system/lib/64/extractors
또는 공급업체 APEX에 맞춤 추출기를 배치합니다. 이 추출기는 Google 추출기가 포함된 Google APEX와 함께 열립니다. 프레임워크에서 추출기를 로드했는지 확인하려면 다음 명령어를 실행합니다.
adb shell dumpsys media.extractor
다음과 같이 사용 가능한 추출기 목록이 표시됩니다.
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)
Google이 제공하는 추출기에서 이미 지원하는 형식을 맞춤 추출기에서 지원하는 경우 Google이 제공하는 추출기보다 더 높은 신뢰 수준을 반환하는 Sniff()
함수를 사용하여 프레임워크에서 맞춤 추출기를 사용하도록 할 수 있습니다.
미디어 프레임워크에서 /system/lib/64/extractors
또는 공급업체 APEX로부터 추출기를 로드하면 추출기에서 파일을 인식하여 콘텐츠 정보를 가져옵니다. 다음 단계는 형식에 맞는 디코더를 추가하여 프레임워크가 파일 콘텐츠 파싱 방법을 이해할 수 있도록 하는 것입니다.
맞춤 디코더 만들기
Google이 제공하는 디코더에서 아직 지원하지 않는 형식이라면 맞춤 디코더가 필요합니다. 예:
MP3가 포함된 AVI 파일용 미디어 프레임워크 지원을 추가하려면 AVI 추출기가 필요하지만 MP3 디코더는 이미 존재하기 때문에 필요하지 않습니다.
Windows Media가 포함된 AVI 파일용 미디어 프레임워크 지원을 추가하려면 AVI 추출기와 Windows Media 디코더가 모두 필요합니다.
새 디코더를 추가하는 방법은 AVC 또는 HEVC용 자체 하드웨어 디코더를 추가하는 방법과 비슷합니다.
추출기는 포함된 미디어 트랙의 MIME 유형을 게시하지만, 이러한 MIME 유형을 지원하는 코덱이 있어야 파일이 완전히 지원됩니다. 사용되는 실제 MIME 유형 문자열은 추출기와 코덱 간의 엄격한 계약입니다(문자열은 MediaDefs.h
파일에 추가할 필요 없음).
미디어 스캐너와 통합
미디어 스캐너가 새 파일 형식을 찾아서 미디어 데이터베이스에 추가합니다.
미디어 스캐너에서 맞춤 파일 형식을 처리하도록 하려면 스캐너가 이러한 정보를 알아야 합니다. Android 10 이상에서 libcore
의 MimeUtils
는 MIME과 확장 프로그램 간의 매핑을 유지합니다. 이전에는 이 매핑이 MediaFile.java
파일에서 처리되었으며, 이 파일에는 MIME 유형에서 MTP 형식 상수로의 매핑이 계속 포함됩니다.
추출기는 지원하는 파일 이름 확장자(예: MP3 또는 MP4) 목록을 내보낼 수 있습니다. 하지만 LegacyMediaScanner
에서만 이를 사용합니다. 기본으로 사용되는 ModernMediaScanner
에는 아무 영향이 없습니다.