audio

来源:互联网 发布:js 日历控件 周选择 编辑:程序博客网 时间:2024/04/29 12:10

关于音频文件时长问题的总结

 

在拉菲项目中,涉及音频时长的问题较多,有必要归纳总结一下。我们知道,高通平台他们自己有一套完整的解析音视频的框架,所以,解析音视频这块没有使用Android原生的解析框架。

高通在添加他们自己解析音视频框架的同时,并没有干掉Android原生的解析框架,而是使用属性值进行控制:

mm.enable.qcom_parser=0  //使用Android原生的解析器

所以,我们在定位有些问题时,可考虑该种场景,设置该属性值为0,使用Android解析器解析文件,来对比分析定位问题。

 

下面带着问题一起来分析:

Q1.LAFITE-11489 最近播放更改歌曲名称后,进入本地音乐列表显示乱码

操作步骤:最近播放,更改歌曲名称,进入歌曲界面

实际结果:歌曲列表更名名称的歌曲显示乱码,最近播放列表正常

预期结果:更改名称显示正常

 

首先拿到该类问题,需要确定测试源文件(包括标题、时长、日期、艺术家等信息)是否显示正常,可使用MediaInfo工具确认。确认源文件正常后,一方面可将歌曲放入不同基线上的手机中进行对比;另一方面,使用不同的播放器(包括三方播放器)在同一基线上的手机中进行对比。这样基本就能确定分析问题的方向。

如Q1问题分析,经过对比分析,发现一般音乐播放器是不支持修改歌曲详细信息的,而拉菲的音乐播放器支持该功能。那么它是如何实现的,是使用Android原生的框架,还是拉菲自己的框架?会不会是修改音乐文件名称引入的问题呢?还是媒体库在扫描时解析出的问题?

与拉菲同事沟通了解到,拉菲音乐播放器使用三方lib库来修改音乐文件名称和艺人名库,三方库: https://github.com/mpatric/mp3agic,下载代码可以看到其实现原理。如果确定不是三方库修改导致的,则需要分析解析那块出问题了。当然,就这个问题而言,第一步就确认出源文件存在问题,基本可以定位了。

 

Q2.LAFITE-8590录制18个小时的录音后去播放,显示时长却是12个多小时的

【操作步骤】

1.进入录音

2.长时间录音18个小时

3.保存录音

4.点击播放

5.观察时长

【实际结果】只显示12小时25分钟

【预期结果】时长显示正确

      

如Q1所述,首先确认录音源文件,如右图:可以看到总时长确定没有问题,而mdhd时长换算后大约为12小时;

我们知道Android中取得mp4文件播放时长的处理位于MPEG4Extractor::parseChunk函数中,是从mdhd box中取得timescale和duration后,通过公式播放时长 = duration / timescale 计算出播放时长的,单位为秒(s)。Android与一般从mvhd box中取得mp4播放时长的处理不一样。(参考:计算MP4文件播放时长的方法),mdhd位于"moov/trak/mdia/" box下面,如下右图所示,是一个audio track展开后显示的box结构。(mp4 chunk在apple的规范中称作atom,在标准mp4中称为box。)

   由于Android默认是注释了debug log,分析该问题需要将debug log全部打开#define LOG_NDEBUG 0;涉及解析代码如下:

 

Media Framework/av相关代码
frameworks/av/media/libmedia/mediaplayer.cpp 
frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp 
frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayer.cpp 
frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp 
frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp 
frameworks/av/media/libmediaplayerservice/nuplayer/GenericSource.cpp 
frameworks/av/media/libstagefright/NuMediaExtractor.cpp 
frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp 
frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDecoderPassThrough.cpp 

CODEC相关代码: 
frameworks/av/media/libstagefright/ACodec.cpp 
frameworks/av/media/libstagefright/OMXCodec.cpp 
frameworks/av/media/libstagefright/MediaCodec.cpp 

Extractor高通解析器相关代码: 
vendor/qcom/proprietary/ 
./mm-parser/Android_adaptation/src/MMParserExtractor.cpp
./mm-parser/Android_adaptation/src/QCExtractor.cpp 
./mm-parser/Android_adaptation/src/QComExtractorFactory.cpp 

为了避免干扰,可将设置中触摸提示音及拨号提示音全部关闭。根据打印log信息显示:

 01-0107:19:03.161 332 5047 V MMParserExtractor: MMParserExtractor::readMetaDataAudio track metadata numChannels = 2 samplingRate = 44100 timeScale = 1000000duration = 44739244

总时长在 audio track 的tkhd中解析出大约为18小时,但是在audio mdhd中显示的是12小时,究其原因发现,audio mdhd中定义的 timescale 是48000, 总时长为0x7FFFFFFF ,换算后,大约为12小时。

求助高通:Most ofthe clip, in audio track, the two duration should be same, but for this clipduration is too large, in mdhd, duration is get the largest (0x7FFFFFFF), butstill can’t satisfy the need, then cause the issue. You can use differentplayer to open the clip, some duration is 18h, some is 12h.

即该文件的总时长超过了定义的最大值,而有些播放器是读取的mdhd的值,而有些播放器是读取的tkhd,所以有些播放器显示正常,有些播放器显示不正常。

 

Q3.LAFITE-3070【DVT1:多媒体专项】【必现】【HQ】视频时长显示不正确

【测试步骤】测试机放入(H264+MP2).Ts视频,在播放列表和播放器中查看视频时长

【实际结果】在播放列表时长显示02:10,播放器中显示01:59

【预期结果】播放列表中和播放器中视频时长显示一致,且显示正确

 

如Q1、Q2分析方法:确认源文件正常,非平台问题后,需要打印log确认getDuration()时长与mediascan 扫入数据库时长。

在BSP版本,视频解析出duration为2分09秒;log如下:

01-01 07:19:03.161 332 5047 V MMParserExtractor:MMParserExtractor::readMetaData Audio track metadatanumChannels= 2 samplingRate = 44100 timeScale = 1000000 duration= 23150226

同时,导出Mediaprovider数据库,查看mediascan 中的时长为129920,大约也是2分9秒。

另一方面,使用bsp版本中自带图库播放,还是第三方播放器播放,视频列表中时长和播放视频过程中显示时长,都是2分09秒。基本可以排除解析出错。对比Leui版本,使用三方的播放器播放,视频列表中时长和播放视频过程中显示时长为1分59秒;那么问题基本明了,确定是拉菲视频播放器或拉菲media框架那块出了问题。

 

 

0 0
原创粉丝点击