腾讯优测是专业的移动云测试平台,提供全面兼容性测试,远程真机租用等多维度的测试服务,让测试更简单!
有人喜欢听着音乐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的多媒体功能主要包括拍照,摄像,录音和音视频播放,如下是各功能的调用层次图。java
图中,红色框内的部分是多媒体核心media库的内容,其中的文件格式处理和编解码部分是经常出现适配问题的地方。接下来咱们就来讨论一下适配问题。
【多媒体功能的适配问题】
众所周知,多媒体功能的实现主要包括两个环节:
1.输入输出:多媒体数据流的输入和输出系统
2.中间处理:编码,解码,文件处理
其中,输入输出部分主要由硬件抽象层实现,而中间处理部分主要由OpenCore实现。(OpenCore 是PacketVideo公司研发的多媒体框架,它是android多媒体核心。)
在咱们实际收集的多媒体适配问题中,绝大多数是出自第二个环节,编解码和文件格式问题。另一小部分是奇葩的API问题。这里咱们重点讨论一下编解码和文件格式问题。
android支持的编解码及文件格式:
首先,咱们要区分两个概念就是文件格式和编码格式,它们不是一回事。文件只是一个容器,而文件里的音视频压缩算法才是具体的编码格式。某个格式的文件能够支持多种编码格式,同时某个编码格式能够被多个文件格式支持。
Android支持的音/视频编码方式仅包括:AAC LC、HE-AACv一、AAC ELD、AMR-NB、AMR-WB、PCM/WAVE、H.26三、H.264 AVC、VP8,输出的视频格式也只有.3gp、.mp四、
.webm、.mkv,这点在开发中须要注意。尤为是其中至关一部分格式都是较高版本的SDK才支持的。而3.0之前支持的格式很是有限。如下是android系统支持的格式:·表明支持。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客户配备了专家团队提供定制化综合测试解决方案。程序员