老板想把AVS解码器移植到Android 2.3 系统中,但是小弟现在还不知道如何入手,请各位大虾指点下,如果有相关资料就更好了,谢谢大家了。

解决方案 »

  1.   

    可以参考framework/base/media/libstagefright/AwesomePlayer.cpp中的
    sp<MediaSource> OMXCodec::Create(
            const sp<IOMX> &omx,
            const sp<MetaData> &meta, bool createEncoder,
            const sp<MediaSource> &source,
            const char *matchComponentName,
            uint32_t flags)
    函数。
    android在这里面创建了软解码器,
    一般的软解码器是派生自MediaSource。
    只能提供这么多帮助了。
      

  2.   

    我在网上找了些资料,使用JNI或者NDK应该是可以实现这个功能的,但是网上说的都好模糊,不是很懂整个流程,所以请高手们指点下。
      

  3.   

    要使第三方接口必然只能使用JNI或者NDK调用呀Android源码中media播放器也是通过这个方法实现的,多鲜明的例子呢。
    framework/......./各种功能.cpp
    jni 调用 把一些结果值 返回给上层java
    packages/apps/....../各种对应功能的.javaJust try it 
      

  4.   

    关注下
    PS:6楼的头像太android了,哈哈
      

  5.   

    没有任何问题,你可以实现为OMX的component,然后继承进OPENCORE或者STAGEFRIGHT里面调用
      

  6.   

    非常感谢,我现在正在看android里media的播放器实现方法,但是没什么心得,还请指教下具体看哪些例子比较好,谢谢啦~~
      

  7.   

    最初的想法就是把AVS解码器作为omx的插件,然后使用omx返回给上层的接口调用解码器,现实解码功能。但是,可能是我不会找资料,我没找到怎么把解码器添加到omx的资料,还请大虾指教下该怎么做,谢谢了
      

  8.   

    1 写java端播放器 ,留下jni接口
    2 使用你本地的c代码(已有的解码代码)实现这个jni接口.  1 > 关于写播放器,我想出了基本的界面布局以外,你还会用到SurfaceView 就是底层的支持opengl的绘图view. 这个你如果不清楚,找些游戏引擎代码看看,会有帮助. 你整个程序的流程就是播放器打开文件,得到输入流 ,输入流传递给解码器, 解码器解码, 解码器输出流, 输出流来到java端,java端调用SurfaceView绘图. 或者我看一些游戏绘图,也使用了c++代码,你可以参考一下.这样 效率应该更高.
      

  9.   

    移植个解码器而已,没必要还非得自己写个播放器吧
    参考libstatefright/codecs目录里的代码,封装实现start、stop、read三个接口就可以了
      

  10.   

    好的,谢谢了。您能更仔细的说下,具体是看哪些代码吗?我在libstagefright目录下没找到codecs
      

  11.   

    我也在做,看了下回复,13L的回答应该是最好的,
    是不用自己写什么jni调用接口,直接使用标准的meidaPlayer写个简单应用就行,csdn就有很多播放器下载,
    要扩展解码器,(我的是基于2.2做的,2.2之后都是使用的statefrightPlayer框架流程)
    首先了解下系统本身的调用流程,statefrightPlayer使用的AwesomePlayer来实现的,
    所以从Awesomeplayer开始看就行,首先是分离器的实现,对于系统本身不支持的格式是没有分离器的,
    具体查看代码(我只以本地文件播放举例,不说网络流播放),
    Awesomeplayer.cpp的setDataSource_l(
            const sp<DataSource> &dataSource) {
        sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);这个就是创建分离器的地方,查看代码MediaExtractor.cpp的create函数,datasource的sniff函数就是自动检测媒体格式容器的类型的,楼主要新增原系统无法识别的媒体格式,必然无法得到有效的分离器,所以这里需要自己创建自己分离器,我就暂时没有自己写相应的sniff函数,每一种格式的XXXXExtractor.cpp函数中有个SniffXXXX函数,在Awesomeplayer的构造函数中的这一句DataSource::RegisterDefaultSniffers()就是注册好所有的sniff函数,额,这个你想标准化点就这么干吧,写一个自己的XXXExtractor类,照样写个XXXXsinff函数,在RegisterDefaultSniffers中加入自己的函数,
    然后就是怎么来实现自己的分离器了,这个得自己想办法了,看你的媒体格式是什么的,会有相应的分离逻辑,分离出音视频流后,就是进入解码阶段了,
    status_t AwesomePlayer::initVideoDecoder() {
        mVideoSource = OMXCodec::Create(
                mClient.interface(), mVideoTrack->getFormat(),
                false, 
                mVideoTrack);
    这个就是创建的解码器了,create的最后一个参数就是分离出来的独立的视频流,具备的接口最重要的就是read接口,是分离器中实现的,这个track是XXXXExtractor中的getTrack获取的,自己仔细多看代码吧,还有很多细节需要自己琢磨,我只说了个大概,
    然后解码器的实现,估计楼主有源代码吧,对应的视频流格式就对应你自己解码器,
    解码器的逻辑主要集中在OMXCodec.cpp中,sp<MediaSource> softwareCodec =
                InstantiateSoftwareCodec(componentName, source);
    这个函数就是查找解码器的,你肯定要在kDecoderInfo数组里面加入自己解码器名称,在kFactoryInfo注册自己解码器创建函数,
    差不多流程是这样把,关于显示部分就不用管了,解码器对接render部分,应该自己会弄好,解码器最重要的对外接口也就是read接口的,返回的一帧帧的解码后的数据,
      

  12.   

    看了一堆OMX的资料,但是不知道怎么动态加载自己的解码器
      

  13.   

    能让OMX动态加载自己的解码器吗?
      

  14.   

    有源码的话就使用NDK吧源码编译为库文件,可以由Java通过JNI调用,也可以由C语言调用