腾讯优测是专业的移动云测试平台,提供全面兼容性测试,远程真机租用等多维度的测试服务,让测试更简单!

有人喜欢听着音乐high起来,有人会随时随地观看热门电视剧。大多数人都会使用QQ、微信,语音聊天。而郭美美会拍下奢侈品炫耀干爹。这些我们再熟悉不过的手机多媒体功能已经融入到生活中,成为居家旅行必备品。因而很多手机应用都或多或少的涉及到多媒体功能。

通常,手机的多媒体功能包括拍照,录音,录像,播放音频,播放视频,视频通话等等。这些功能对硬件的依赖较大,因此不同机型不同硬件会导致很多适配问题。其中,拍照功能我们之前已经讨论过了,这里我们继续讨论其他多媒体功能和相关的适配问题。

【android多媒体系统】

1.android 多媒体系统结构

Android多媒体系统层次结构

如上图,android多媒体的C语言库是media库,它主要由媒体播放器和媒体记录器框架组成。media库向上层通过JNI提供接口,下层通过PacketVideo等实现。

其中,Java类的目录为:

frameworks/base/media/java/android/media

Java本地调用部分JNI的目录为:

frameworks/base/media/* 这部分内容编译成为libmedia_jni.so

基于opencore的多媒体播放器和记录器的目录为:

external/opencore/

多媒体框架的media库:

frameworks/base/include/media/

frameworks/base/media/libmedia/ 这部分内容被编译成libmedia.so

多媒体服务:

frameworks/base/media/libmediaplayerservice/  这部分内容被编译成libmediaplayerservice.so

其中,framework层是定制rom经常会修改的部分。

2.android各个多媒体功能

Android的多媒体功能主要包括拍照,摄像,录音和音视频播放,以下是各功能的调用层次图。

图中,红色框内的部分是多媒体核心media库的内容,其中的文件格式处理和编解码部分是常常出现适配问题的地方。接下来我们就来讨论一下适配问题。

【多媒体功能的适配问题】

众所周知,多媒体功能的实现主要包括两个环节:

1.输入输出:多媒体数据流的输入和输出系统

2.中间处理:编码,解码,文件处理

其中,输入输出部分主要由硬件抽象层实现,而中间处理部分主要由OpenCore实现。(OpenCore 是PacketVideo公司研发的多媒体框架,它是android多媒体核心。)

在我们实际收集的多媒体适配问题中,绝大多数是出自第二个环节,编解码和文件格式问题。另外一小部分是奇葩的API问题。这里我们重点讨论一下编解码和文件格式问题。

android支持的编解码及文件格式:

首先,我们要区分两个概念就是文件格式和编码格式,它们不是一回事。文件只是一个容器,而文件里的音视频压缩算法才是具体的编码格式。某个格式的文件可以支持多种编码格式,同时某个编码格式可以被多个文件格式支持。

Android支持的音/视频编码方式仅包括:AAC LC、HE-AACv1、AAC ELD、AMR-NB、AMR-WB、PCM/WAVE、H.263、H.264 AVC、VP8,输出的视频格式也只有.3gp、.mp4、

.webm、.mkv,这点在开发中需要注意。尤其是其中相当一部分格式都是较高版本的SDK才支持的。而3.0以前支持的格式非常有限。以下是android系统支持的格式:·代表支持。

说到这里,很多同学要疑惑了!流行的avi, flv, rmvb格式都不支持么?的确是这样的!标准的android系统不支持!那为什么很多手机支持的格式不止上面这些呢?这是厂商定制rom在framework层做了修改,并且配合多媒体处理硬件,拓展的功能。这也是引起适配问题的原因。

Android设备对于多媒体文件的处理,除了可以用软件opencore框架解码,也可以用多媒体处理器进行硬件解码。但是想要实现高效、高清、高保真的播放效果,硬件解码和硬件加速的效果要远远高于软件解码。因此手机厂商对多媒体的支持更偏重于在硬件上下功夫。但是不同硬件的解码能力那就五花八门了。比如常见的三星的手机和平板通常支持除去rmvb以外所有的主流格式(包括微软的wmv等),这主要是因为Real公司授权限制所致。但是国内的“山寨”平板手机通常都具备支持rmvb硬解能力。

【适配问题举例】

1.编解码和文件格式问题

(1)录音问题

录音功能的API调用如下:

File soundFile = new File(“/mnt/sdcard/sound.amr”);

MediaRecorder mRecord = new MediaRecorder();

mRecord.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

mRecord.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);

mRecord.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

mRecord.setOutputFile(soundFile.getAbsolutePath());

mRecord.prepare();

mRecord.start();

其中,标注为红色的参数是导致问题的参数。这类问题很多见,很多种参数组合都会导致问题。下面列举出来,给大家提个醒!在使用的时候要特别注意。

组合 AudioSource. OutputFormat. AudioEncoder. 问题机型
1 CAMCORDER AMR_NB AAC sony ST25i
2 DEFAULT AMR_WB AMR_NB sony ST25i
3 DEFAULT MPEG_4 AMR_NB 多款机型
4 MIC AMR_WB DEFAULT 多款机型
5 MIC DEFAULT AMR_WB 多款机型
6 VOICE_CALL MPEG_4 DEFAULT LG P880
7 VOICE_DOWNLINK THREE_GPP DEFAULT 中兴U880
8   VOICE_RECOGNITION THREE_GPP DEFAULT 多款机型
9 VOICE_UPLINK THREE_GPP DEFAULT 多款机型

这里把常用的API所支持的格式列出来,供各位开发同学参考:

(2)播放问题

播放功能的API调用如下:

MediaPlayer mMediaPlayer = MediaPlayer.create(TestApplication.APPLICATION_CONTEXT, R.raw.audio3ga);

mMediaPlayer.start();

或者:

mMediaPlayer = new MediaPlayer();

Resources res = TestApplication.APPLICATION_CONTEXT.getResources();

AssetFileDescriptor aDescriptor = res.openRawResourceFd(R.raw.audio3ga);

FileDescriptor firstParameter = aDescriptor.getFileDescriptor();

long secondParameter = aDescriptor.getStartOffset();

long thirdParameter = aDescriptor.getLength();

mMediaPlayer.setDataSource(firstParameter,secondParameter,thirdParameter);

aDescriptor.close();

mMediaPlayer.prepare();

其中,红色标注的参数是资源id。如果该id代表的资源文件是某些机型不支持的格式则会出现问题。需要注意的格式是3ga、avi、flv等(请参考上面的表格)。

编解码及文件格式问题目前并没有统一的适配策略,我们需要知道哪些编解码和文件格式在哪些机型上会出现问题,进而避免使用。

2.输入环节

(1)录像问题

部分手机在开始录像之后调节焦距会出现crash。因为硬件不支持该操作。问题机型是

天语-T619/索爱-18i/华为-220t/三星-7500/华为-y310t/中兴n880e(2.3.6)/酷派8022

可行的解决策略是使用try-catch捕捉到crash,再进一步处理。

3.API问题:

(1)多媒体播放有两种API调用方式,前面已经列出来了。但是实际测试发现,由于厂商的特殊修改,调用

mediaPlayer=MediaPlayer.create(TestApplication.APPLICATION_CONTEXT, _uri, _holder);创建对象时,会出现问题,只能调用MediaPlayer.setDataSource来避免问题。而实际上create方法底层也会调用setDataSource方法实现功能。出现问题的机型是HTC EVO3D、MOTO ME722。

(2)回调方法不触发:

调用setRecordPositionUpdateListener方法设置录音监听时,不触发回调方法onPeriodicNotification。这个问题目前没有有效解决办法。但是我们要避免在回调方法里实现功能。问题机型是三星 s5360。

多媒体,多问题。但是再多的问题也难不倒机智的程序员。大连腾讯优测项目已经收集到很多多媒体的适配问题,并且可以通过腾讯优测扫描工具检测出来。欢迎大家体验使用,并且把你遇到的适配问题分享出来!

_______________________________________________________________________________________

腾讯优测是专业的移动云测试平台,为应用、游戏、H5混合应用的研发团队提供产品质量检测与问题解决服务。不仅在线上平台提供自动化兼容性测试、云手机远程租用与调试、漏洞分析、自动化测试工具Xtest等多种质量检测工具,更为VIP客户配备了专家团队提供定制化综合测试解决方案。

腾讯优测优分享 | 多媒体,多问题相关推荐

  1. 转载自:【腾讯优测干货分享】Android5.0-6.0双卡适配指南

    转载自:[腾讯优测干货分享]Android5.0-6.0双卡适配指南 原作者:腾讯优测开发工程师 于长敏 这里仅以获取sim卡的IMSI接口(getSubscriberId)和发短信接口(sendTe ...

  2. 腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径(上)

    文/腾讯公司 陈江峰 优测小优有话说: android开发的坑自然是不少,不想掉坑快来优测优社区~ 最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的.于是在原基础上针 ...

  3. 腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径(上)

    文/腾讯公司 陈江峰 优测小优有话说: android开发的坑自然是不少,不想掉坑快来优测优社区~ 最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的.于是在原基础上针 ...

  4. 腾讯优测-优社区干货精选 |安卓适配之Camera拍照时快门咔嚓声

    文/腾讯优测研发工程师 吴宇焕 优测小优有话说: android机型适配的坑自然是不少,不想掉坑快来优测优社区~ 现在Android手机一般都会带有照相功能,有很多朋友就发现手机照相时快门声音很响,想 ...

  5. 腾讯优测-优社区干货精选 |  那些年,我们在Android机型适配上遇到的坑之Camera拍照时快门咔嚓声...

    文/腾讯优测研发工程师 吴宇焕 优测小优有话说: android机型适配的坑自然是不少,不想掉坑快来优测优社区~ 现在Android手机一般都会带有照相功能,有很多朋友就发现手机照相时快门声音很响,想 ...

  6. 腾讯优测优社区干货精选|手Q刷一刷红包后台设计总结

    文 / 腾讯 邓建俊 优测小优有话说: 以为优社区除了测试知识就没有其他东西啦?手Q大牛带你走一波红包的后台设计!!! 1. 前言 2016除夕夜注定是一个不平凡的夜晚,除了陪家人吃团圆饭.看春晚,还 ...

  7. 腾讯优测优分享 | 分布式系统测试的应用方法——场景注入测试

    腾讯优测是专业的移动云测试平台,提供自动化测试-全面兼容性测试,云真机-远程真机租用,漏洞分析等多维度的测试服务! 在大数据浪潮下,海量数据处理能力的提升是推动大数据不断前行的基础.俗话说,工欲善其事 ...

  8. 【腾讯优测干货分享】从压测工具谈并发、压力、吞吐量

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d914e07b7fc1c26a0cf7c 前言 随着部门业务的拓展,我们有 ...

  9. 【腾讯优测干货分享】使用多张图片做帧动画的性能优化

    本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57fc8cea302e4725036142f6 使用多张图片做帧动画的性能优 ...

最新文章

  1. 对比丨深度学习库大排名:TensorFlow、Keras名列一二,Sonnet增长最快
  2. C语言中的位运算和逻辑运算
  3. JAVA多线程之中断机制(如何处理中断?)
  4. C# 网络编程之使用Socket类Send、Receive方法的同步通讯
  5. Python菜鸟之路:Python基础-Python操作RabbitMQ
  6. 计算机组成与架构综述学习报告
  7. 设计模式C++实现--Observer模式
  8. html5 控制鼠标移动,HTML5 Canvas随鼠标移动的引力粒子群
  9. 耍了一下 UncaughtErrorEvents
  10. linux find 拷贝,通过find命令寻找文件并拷贝到一个指定目录方法详解
  11. devops 开源_没有开源,就不会有DevOps
  12. MySQL学习-子查询及limit分页
  13. Servlet→简介、手动编写一个Servlet、使用MyEclipse编写一个Servlet、Servlet生命周期、路径编写规范、初始化参数、MVC设计模式
  14. CMSIS应用于研究指南图文教程
  15. Ubuntu速配指南之软件参考
  16. php获取扫描枪数据,条码扫描枪的读取技巧
  17. 机动目标跟踪—当前统计模型(CS模型)扩展卡尔曼滤波/无迹卡尔曼滤波 matlab实现
  18. ROS机器人学习历程三:Publisher 和Subscriber
  19. [联合集训6-25] 蓝雨 线段树+主席树+hash
  20. 数据分析模型篇—波士顿矩阵

热门文章

  1. 偶尔勤奋的肥猫——OS时间片轮转调度基本算法
  2. PYcharm联合qtdesign实现python图形可视化GUI编程
  3. 网络打印机安装脚本(rundll32 printui.dll,PrintUIEntry用法示例) 1
  4. Plug And AI角蜂鸟AI开发板在Ubuntu16.04下的安装和使用
  5. 电脑系统--常用操作
  6. dropdownlist控件设置默认值_关于DropDownList默认值的设定
  7. 小朋友学C语言(23):二进制与十进制之间的转换
  8. 福禄克DSX2-8000/DSX2-5000 CH 电缆测试仪带了Cat 6A的测试方法: 超6类网线——光明的未来
  9. winform图文编辑器三个开源项目
  10. oracle 报错总结