前言
在上一篇文章中,简要介绍了 Extractor 组件选择及创建过程。本文将继续 基于 Android 11 探索自定义 Extractor 的实现,及其接入到 Android 多媒体框架中的方法。
C/NDK API 简介
在上一篇文章中我们知道所有的 extractor 组件都需遵循特定的设计规则:
- 实现
GETEXTRACTORDEF
函数,该函数由MediaExtractorFactory::RegisterExtractors
调用;
GetExtractorDef getDef =
(GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF");
CHECK(getDef != nullptr)
<< libPath.string() << " does not contain sniffer";
ALOGV("registering sniffer for %s", libPath.string());
RegisterExtractor(
new ExtractorPlugin(getDef(), libHandle, libPath), pluginList);
- 编译到指定路径,且库名称符合
lib[xxx]extractor.so
形式,如原生的 MP3Extractor 库;
/apex/com.android.media/lib64/extractors/libmp3extractor.so
回顾 MP3Extractor.cpp 代码,定义的 GETEXTRACTORDEF
函数如下:
extern "C" {
// This is the only symbol that needs to be exported
__attribute__ ((visibility ("default")))
ExtractorDef GETEXTRACTORDEF() {
return {
EXTRACTORDEF_VERSION,
UUID("812a3f6c-c8cf-46de-b529-3774b14103d4"),
1, // version
"MP3 Extractor",
{
.v3 = {
Sniff, extensions} }
};
}
该函数返回 ExtractorDef
对象,该对象包含 MP3Extractor 组件的版本、名称、uuid 、支持的格式(extensions)等基本信息,以及 Sniff
函数指针。Sn