Android MediaRecorder自定义分辨率

工作这么久了,确实积累了不少东西,但都是以文档的形式存在U盘里的,为什么不写博客呢?因为懒啊!!!总感觉博客太难写了(大概是上学时候写作文恐惧症 的后遗症吧……),不过现在看看那些积累的有些是自己总结,但也有不少是综合网上各位大佬的文章提炼出来的,应该和大家一起分享啊!!!所以,从今天起, 写!博!客!

废话不多说,第一篇走起!

之前有一个项目,定制的系统,客户要求一个录像的功能,还有分辨率也有要求,但是后来发现客户要求的分辨率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 MediaRecorder自定义分辨率的更多相关文章

  1. ubuntu自定义分辨率

    首先说下为啥要专门敲个文章来说明这个问题,因为我最近入手了一台分辨率为3200*1800的高分辨率笔记本,但使用的时候发现现在的操作系统及其诸多软件对高分辨率屏幕的支持真的是太烂,字体发虚或者变得非常 ...

  2. Android RatingBar 自定义样式

    Android RatingBar 自定义样式 1.先定义Style: <style name="RadingStyle" parent="@android:sty ...

  3. Android实现自定义带文字和图片的Button

    Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...

  4. Android Studio 自定义debug签名文件keystore

    Android Studio 自定义debug签名文件keystore

  5. Android读取自定义View属性

    Android读取自定义View属性 attrs.xml : <?xml version="1.0" encoding="utf-8"?> < ...

  6. 【linux】xrander/cvt自定义分辨率

    今天在虚拟机上装了一个LUbuntux64(12.10)玩,安装的时候,由于主板默认是没有开虚拟化支持,报错,改后相当的顺利.但是进入系统后,屏幕显示分辨率为800X600的,全屏的话,在大显示器上显 ...

  7. Android之自定义画图文字动画

    结构: BaseView: package com.caiduping.canvas; import android.content.Context; import android.graphics. ...

  8. debian 显示器使用自定义分辨率

    比如你要使用 1440x900 的自定义分辨率,先利用 cvt 计算一个新的 modeline $  cvt 1440 900 输出为: # 1440x900 59.89 Hz (CVT 1.30MA ...

  9. Android 三档自定义滑动开关,禁止点击功能的实现,用默认的seekbar组件实现

    android三档自定义滑动开关,禁止点击功能的实现,普通开关网上有很多例子,三档滑动开关的则找了整天都没有相关例子,开始用普通开关的源码修改了自己实现了一个类,但效果不如人意,各种边界情况的算法很难 ...

随机推荐

  1. Django REST framework 自定义(认证、权限、访问频率)组件

    本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...

  2. UTL

    在PL/SQL中,UTL_FILE包提供文本文件输入和输出功能. 可以访问的目录通过初始化参数UTL_FILE_DIR设置. 注意:UTL_FILE只能读取服务器端文本文件,不能读取二进制文件.这时候 ...

  3. Flask - Flask的蓝图(BluePrint)

    目录 Flask - Flask的蓝图(BluePrint) 一. 初始Flask蓝图 进阶Flask蓝图 使用蓝图做一个增删改查 1.使用蓝图进行web应用搭建: 2.使用Flask蓝图,查看学生信 ...

  4. 2.1 Java开发工具包

        Java专业术语                   术语名   缩写                                                             ...

  5. 7 numpy 傅里叶,提取图片轮廓

    任务:提取照片中轮廓   本次处理图片:我的女神之一  江一燕   导入模块: #jyy.show()   会打开本地图片浏览器       使用傅里叶反转 获取实部,舍弃虚部 去除小数部分 将一维数 ...

  6. noip模拟赛 钻石

    分析:用裸暴力可以得60分,每次dfs,看第i个盒子到底有没有钻石就行了.其实这很像0/1背包问题,只是多了一个m的限制.这要怎么办呢?因为概率是可以加减的,所以可以先不考虑m的限制,求出概率,然后d ...

  7. Spring MVC-视图解析器(View Resolverr)-内部资源视图解析器(Internal Resource View Resolver)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_internalresourceviewresolver.htm 说明:示例基于S ...

  8. 实现MVC.NET 5的国际化

    实现国际化有三种做法: 创建资源文件. 每种语言设置一套单独的View. 1 + 2. 通常而言,第一种方法的可维护性是最高的.因为随着项目的规模的扩大,为每种语言设置一套单独的View,前期的工作量 ...

  9. 关于创建Android Library所须要知道的一切

    关于创建Android Library所须要知道的一切 Android 库(Library)在结构上与 Android 应用模块同样.应用模块所能够包括的东西.在库中都同意存在,包括代码文件.资源文件 ...

  10. HTML_项目符号使用图片

    本文出自:http://blog.csdn.net/svitter 创建一个HTML页面. 其内容为一个无序列表. 列表中至少包括了5本畅销书,每本书之前的项目符号必须採用概述封面的缩略图. 这些信息 ...