基于 FFmpeg 的自定义 Media Extractor(3):自定义 Extractor 的实现方法

前言

在上一篇文章中,简要介绍了 Extractor 组件选择及创建过程。本文将继续 基于 Android 11 探索自定义 Extractor 的实现,及其接入到 Android 多媒体框架中的方法。

C/NDK API 简介

在上一篇文章中我们知道所有的 extractor 组件都需遵循特定的设计规则:

  1. 实现 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);
  1. 编译到指定路径,且库名称符合 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值