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. android 自定义分辨率,Moonlight Android端自定义分辨率,解决黑边问题

    更新:使用原版moonlight修改特殊分辨率需要root权限,没有root权限可尝试此版本的moonlight选择当前设备分辨率. 再次更新:moonlight 9.8版本以上已经支持设置为当前设备 ...

  2. android 自定义弹窗diss,Android中自定义PopupWindow,动态弹窗。

    我的第一篇博客,咱们直奔主题.先上个效果图 在android中自定义PopupWindow: 1.首先定义好你想要显示的窗口的布局文件,再实例化一个View对象:窗口布局可灵活变化,dialog_la ...

  3. android studio自定义app图标

    android studio自定义app图标 1.右键app名称-New-ImageAsset 2. 选择Launcher Icons(Legency only) Name 图标名称这里不要更改 不更 ...

  4. Android进阶——自定义View之自己绘制彩虹圆环调色板

    引言 前面几篇文章都是关于通过继承系统View和组合现有View来实现自定义View的,刚好由于项目需要实现一个滑动切换LED彩灯颜色的功能,所以需要一个类似调色板的功能,随着手在调色板有效区域滑动, ...

  5. 因特尔显卡自定义分辨率_蓝宝石RX 5600XT 6G D6 白金版OC显卡评测:两千价位段好选择...

    对于大多数玩家而言,一款心仪的显卡可能不需要夸张的包装和华丽的外观,更重要的是实惠的价格和强劲的性能.AMD Radeon RX 5600XT,正是一款专为主流游戏玩家设计的诚意之作,不仅能够满足各大 ...

  6. 自定义分辨率软件_苹果剪辑软件Final Cut Pro X导出竖屏视频教程

    之前看教程,有讲师说Final Cut Pro X以下简称FCPX软件不能导出自定义分辨率视频,即不能导出内置分辨率以外的视频,那现在手机短视频时代就没法用了吗?其实不是的,FCPX支持竖屏乃至自定义 ...

  7. Android ListView 自定义背景后 滚动时的背景变黑问题

    ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉,原因是,滚动时,列表里面的view重绘时,用的依旧 ...

  8. android 实现自定义监听接口,Android在自定义类中实现自定义监听器方式

    Android在自定义类中实现自定义监听器方式 发布时间:2020-08-31 06:19:39 来源:脚本之家 阅读:203 作者:Simon_Qi 监听器可以说是Android开发中最常用的东西之 ...

  9. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

最新文章

  1. N32-马哥Linux第一周学习
  2. [家里蹲大学数学杂志]第427期与反对称矩阵有关的一个行列式
  3. Kettle使用_8 存储过程结合获取系统信息
  4. 数据结构(7)—— 排序总结
  5. Shiro学习记录(详细)
  6. 全国计算机等级考试题库二级C操作题100套(第69套)
  7. 其它数据类型和Json的转化
  8. 安卓游戏开发用什么引擎_游戏开发学习第一天————用什么软件
  9. g++ linux 编译开栈_linux下使用g++编译cpp工程
  10. linux环境c语言课程设计,linux环境下c语言编程课程设计
  11. 【ICML2019】Set Transformer:置换不变的注意力神经网络框架
  12. OpenCV快速入门六:图解Numpy
  13. distpicker
  14. 柯美smb扫描出现服务器连接错误_柯尼卡美能达283设置好扫描之后,不能完成,提示与服务器连接错误,是什么原因,之前是可以用的...
  15. 自动删除微博【新版微博】
  16. stm32学习(启动+LED+按键)
  17. mif2png(QQGame 专用 mif 格式转 png 格式)
  18. 临汾市新东方计算机学校,新东方在线走进校园——全国中小学大型公益讲座“怒放青春”走进临汾...
  19. slot-scope用法及理解
  20. 操作系统——基础练习(期末复习)

热门文章

  1. 时间序列模型 ARIMA
  2. Flask 学习-47.Flask-RESTX 自定义响应内容marshal_with
  3. 测试Bitmap和Marshal.Copy
  4. C语言带参数的回调函数怎么传参,C语言如何实现回调函数
  5. 验证6种信用卡卡号的代码
  6. android okhttp3 okio,OkHttp和Okio
  7. 农夫过河算法java,Java简单实现农夫过河问题示例
  8. 什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
  9. VCL界面控件DevExpress VCL发布v20.2.6
  10. SAP 平行帐(Parallel Accounting)