你好,游客 登录 注册 搜索
背景:
阅读新闻

Android MediaRecorder自定义分辨率

[日期:2017-08-13] 来源:Linux社区  作者:jokerjoke [字体: ]

之前有一个项目,定制的系统,客户要求一个录像的功能,还有分辨率也有要求,但是后来发现客户要求的分辨率Android默认是不支持的,于是就要自定义 了。注:因为是之前的文档记录,不确定会不会有细节上的问题,如果各位朋友不能实现自定义分辨率,欢迎反馈!我当时是确实已经实现了 的!!!

        该文章的一切都是建立在MTK Android5.1源码基础上的修改,其它版本可能会有差异!!!

        一、Andoird对于分辨率的检查

        用过MediaRecorder的朋友都知道,这个类是可以设置分辨率的,我最开始也没多想就直接设置了客户要求的,但是录像后却发现分辨率不对,顿时我 就懵逼了……后来开始查源码,终于让我找到了,原来Android在内部进行了分辨率的检查,如果不是支持的分辨率,就给你换掉了!!!

        具体检查的文件为:/frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp

        其中有这么一个函数:status_t StagefrightRecorder::checkVideoEncoderCapabilities(bool *supportsCameraSourceMetaDataMode)

        该函数中有三个位置进行了分辨率的检查:

        1、#ifndef ANDROID_DEFAULT_CODE
                checkVideoEncoderCapabilitiesEx();(该位置检查宽高是否在范围内,不在则更换编码方式)
              #endif
        2、clipVideoFrameWidth();(该位置检查宽度若小于最小值则设为最小值,若大于最大值则设置为最大值)
        3、clipVideoFrameHeight();(该位置检查高度若小于最小值则设为最小值,若大于最大值则设置为最大值)

        从上边可以看出,Android可用的分辨率是有一定范围的,那如果需要的分辨率不在这个范围内怎么办呢?别着急,看下边!

        二、MediaRecorder支持分辨率范围配置

        分辨率范围的修改在该文件中进行:/frameworks/av/media/libmedia/MediaProfiles.cpp

        以修改H264的分辨率范围为例:

        该文件中有这么一个函数:static int getVideoCapability(int i4VideoFormat, unsigned int *pu4Width,  unsigned int *pu4Height,
  unsigned int *pu4BitRatem,  unsigned int *pu4FrameRate, int slowmotion)

        好吧,函数有点长……但是注意函数的参数,pu4Width以及pu4Height是两个指针,而这两个指针就将存放分辨率宽高的上限!(该函数的调用也 在本文件中,有兴趣的可以自己跟踪看一下我就不废话了),在getVideoCapability函数中又一个switch是匹配了多种分辨率,只需要在 对应的分辨率case语句最后修改这两个指针指向的值,就可以达到修改分辨率上限的目的。

        三、自定义分辨率

        好了,分辨率上限也根据需要修改了,接下来终于可以开始该分辨率了!

        首先需要修改的文件是:/vendor/mediatek/proprietary/custom/<project>/hal/D1/sendepfeature/config.ftbl.common_raw.h

        该文件中定义了很多分辨率对,比如预览界面、照片、视频等都在该文件中,现在需要做的就是在FTABLE_CONFIG_AS_TYPE_OF_DEFAULT_VALUES下边已有的分辨率中按原有格式加上你自己需要的分辨率。

        加上以后并没有万事大吉,我们继续

        接下来要改的文件是:/frameworks/av/media/libmedia/MediaProfiles.cpp

        这个文件就不太好解释了(我表达能力捉急啊求原谅……),总之,该文件中配置了很多视频参数,根据你的项目版本以及视频编码方式,找到对应的那个视频参数,修改其中的分辨率为自定义的分辨率。

        比如:new MediaProfiles::VideoCodec(VIDEO_ENCODER_H264, 9000*1000/CamMode, 1280, 720, 30/CamMode);

        看了一后应该很明白吧,分辨率就是1280x720,改了这俩参数就行了,然后就在MediaRecorder中设置分辨率,录视频,惊奇的发现,分辨率改了!!!

        最后再罗嗦一点:

        MTK对一些视频信息也有封装,可以用以下方法获取:

        import com.mediatek.camcorder.CamcorderProfileEx;
       CamcorderProfile mProfile = CamcorderProfileEx.getProfile(CamcorderProfileEx.QUALITY_FINE);

        其中CamcorderProfileEx在AndroidStdio中会报错,因为不是SDK中的,但是源码编译是没问题的,CamcorderProfileEx中定义了不少类似QUALITY_FINE的常亮,可以进源码看一下

        好了,就这么多了,到此结束,其实这个方法不只能自定义视频分辨率,对照片自定义分辨率也可以作为参考,当然,这个我没试过,大家可以试试。

更多Android相关信息见Android 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=11

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-08/146177.htm

linux
相关资讯       Android MediaRecorder 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款