目前大概知道的:
1. android多媒体框架有两个:OpenCore和Stagefright。
2. android中的mediaplayer解码的时候会使用OpenMAX标准。
3. 硬件厂商可以通过OpenMAX标准支持硬件解码。
问题是:
1. 应用程序员是否可以通过jni的方式调用厂商支持的硬解码功能,如果可以,需要怎么做?
2. 应用程序员如果要做一个软解码的支持,比如针对flv的软解码,有没有可能让系统的多媒体框架调用,如果可以调用,需要做哪些工作?
十分感谢您的关注和回复。

解决方案 »

  1.   

     ,
    可以通过改framework 实现,或者是用NDK使用FFMPEG 软解码。例如rockplayer 就是用ffmpeg软解。
    http://rockplayer.freecoder.org/tech_cn.html
      

  2.   

    个人感觉两种方式吧
    一,自己在framework增加自己的类似于stagefright的media framework,自己的应用通过JNI调到,然后再去调自己的解码器如ffmpeg
    二,把自己的解码器包装成stagefright能使用的组件,应用通过调用android标准的media framework来实现
      

  3.   

    在系统的多媒体框架上添加插件的方式只有系统程序员可以做到,比如做系统Image可以,因为系统多媒体框架调用方式的关系,系统不会调用用户级的动态库。所以在系统原有的多媒体框架的基础上添加软解码的插件,对应用程序来说是不可能的了。主要是想知道有没有方法可以调用系统的多媒体框架中的解码部分,也就是系统的OpenMAX框架部分。
      

  4.   

    OpenCore和Stagefright本身就支持硬件厂商的编解码器,符合openmax标准如果要增加别的文件格式支持,你需要给opencore或者SVTAGEFRIGHT些插件,实现文件格式的parse,另外软件解码器可以做成openmax的component让框架调用,这些都是使用C/C++实现,最后是so的形式出现,这些的华上层JAVA APP不需要修改任何东西,秩序调用mediaplayer类的方法就可以了,和以前的调用发放一样.
    当然你可以不是用opencore/stagefright,自己实现框架,这样的华工作就打了,需要NDK,JNI等技术
      

  5.   


    系统so在不设置的情况下不会调用用户级应用的so的吧,似乎要一个.cfg配置文件,而这个文件是系统级的。OpenCore和Stagefright是支持硬件编解码,不过他的实现方式似乎是调用了底层的OpenMAX框架,而设备制造商会在驱动层实现OpenMAX的实现。我的意思是能不能通过jni直接调用OpenMAX的decode函数,因为OpenCore或Stagefright框架把demux和decode都封装在一起了,实际上demux基本上也是软件的方式实现的,主要的瓶颈在decode上,如果能直接调用OpenMAX的decode,就可以很轻松的实现类似于FLV这样格式视频的“硬解码”了。
      

  6.   

    我不明白你为什么要通过jni直接调用OpenMAX的decode函数,实现类似于FLV这样格式首先要DEMUX,然活才能得到视频的BITSTREAM,这样才能把数据发送给OPENMAX中的相应的解码component.通过jni直接调用OpenMAX的decode函数,现有的框架代码不支持,除非你增加新的接口!
      

  7.   


    我的意思是如何给系统框架添加demux的支持.如果使用插件的方式支持,就需要修改多媒体框架,至少需要修改多媒体框架加载demux的流程,而这个过程是应用层开发无法实现的(我的理解,也许可以?).所以打算自己用软件方式demux,然后通过OpenMAX调用硬件的decode。
      

  8.   

    而这个过程是应用层开发无法实现的(我的理解,也许可以?)应用曾也可以实现,你可以不用调用系统的人设框架SO,全部自己实现,那样的华都是JAVA,效率太低了没什么实际意义
      

  9.   

    楼主,你是怎么在android上做 硬解码的,遇到和你同样的问题。
    可否指点指点~~