如何创建一个Stagefright插件

4
我有一个任务需要将视频解码器集成到Stagefright(Android的多媒体框架)中。我查找并发现了以下关于为Stagefright创建新插件的内容: 要添加对新格式的支持,您需要:
  • 如果容器尚未受到支持,则开发新的抽取器类。

  • 开发新的解码器类,实现StageFright核心所需的接口来读取数据。

  • OMXCodec.cpp文件的kDecoderInfo数组中,将要读取的文件的MIME类型与您的新解码器相关联。

    static const CodecInfo kDecoderInfo[] = {  
        {MEDIA_MIMETYPE_AUDIO_AAC, "OMX.TI.AAC.decode"},
        {MEDIA_MIMETYPE_AUDIO_AAC, "AACDecoder"},
    };

我在网络上找到了以上的所有数据。现在我有一个简单的应用程序,它将以文件作为输入,并使用Android本机API在屏幕上呈现它。请问有谁能告诉我如何进一步操作?所有这些OMXCodec.cpp和其他内容从哪里来,我应该将它们放在我的项目的哪个目录中。请提供相关解决方案。谢谢。

1个回答

10

从你的问题中,看起来你正在寻找适用于 冰淇淋三明治 或更早版本的安卓系统的推荐。你首先应该清楚你使用的安卓版本是 冰淇淋三明治 或者之前的版本,还是 果冻豆 及其之后的版本。不同版本的安卓系统对解码器的集成是不同的

我已经在你的另一个问题中发表了评论,该问题是针对 果冻豆 及以后版本的(参考:Android:如何将解码器集成到多媒体框架中)。

如果您想要将您的解码器集成到 冰淇淋三明治 或更早版本中,请按照您问题中提供的步骤进行操作。除了将解码器添加到 kDecoderInfo 列表中外,您还可以根据这里所示设置某些特定的怪癖。

关于 OMXCodec.cpp 的问题,如果您使用的是 冰淇淋三明治,则可以在 frameworks/base/media/libstagefright/ 中找到此文件;如果您使用的是 果冻豆,则可以在 frameworks/av/media/libstagefright/ 中找到它。

如果您已经按照所有步骤将视频解码器集成到 Stagefright 框架中,那么最简单的测试方法是执行以下操作:

  1. 将媒体文件复制到SD卡中

  2. OMXCodec.cpp 中,通过取消注释这个语句 //#define LOG_NDEBUG 0 来启用日志,并在该目录下运行 mm。将重新构建后的 libstagefright.so 复制到您设备上的 /system/lib 目录中。

  • 启用 logcat 并开始捕获日志。

  • 进入图库,选择您的文件并允许标准播放器播放您的文件。

  • 检查您的日志文件,通过搜索您的组件名称来查看播放器是否已选择您的 OMX 组件。如果找到了,那么您对编解码器的整合就成功了。否则,您将需要进行调试并找出问题所在。

  • 附注:

    1. 根据您的请求,我假设您不熟悉 Android 源代码。请参考 androidxref 网站以熟悉 AOSP 发行版。

    2. 除非您打算支持一种新的媒体文件格式,否则您无需支持 Extractor 类。 MediaExtractor 抽象了一个文件格式解析器,并帮助分离媒体文件中的不同轨道。

    希望这些信息能够帮助您将编解码器整合并在 Android 上运行。


    非常感谢...有了这些信息,我肯定可以继续了。如果可能的话,您能否提供一个具体的链接,让我可以从基础知识开始了解Android源代码?在上面给出的链接http://androidxref.com/中,我找不到如何在我的项目中开始使用Android源代码的基础知识。如果您能够提供一个关于如何在任何应用程序中使用Android源代码的来源,我将非常感激您。还有一个小问题:我们是在修改Android源代码还是只是为现有源代码创建一个独立的插件? - Zax
    1
    @Zax 如果你正在寻找Java级别的介绍,可以从这里开始:http://developer.android.com/training/index.html。然而,如果你正在查看集成笔记,则可以在stackoverflow档案中阅读更多内容。要将编解码器集成到`Ice-Cream Sandwich中,您需要修改Android源代码。要将其集成到JellyBean`中,您需要更新特定于平台的文件而不是源代码,这是预期的集成模式。 - Ganesh
    最终我明白了,我需要重建一部分 Android 源代码,并使用 Android.mk 创建一个 libstagefright.so 并将其替换掉设备中 /system/libs 中现有的那个文件。现在为了创建这个 *.so 文件,我需要下载整个 Android 源代码还是只需要下载 frameworks/base/media/libstagefright/ 的内容? - Zax
    @Zax 我认为你可能需要在 frameworks/ 目录下添加更多文件夹。最好的方法是同步整个 Android 源码树并保持其准备就绪。 - Ganesh
    1
    你似乎对Android媒体管道很熟悉,Ganesh。我想在Stack Overflow之外向你提出更多与此主题相关的问题。你有兴趣在这个话题上提供一些咨询工作吗?如果是,请通过saares@axinom.com让我知道。 - Sander
    显示剩余2条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接