分享

红狼博客 ? Android源码阅读笔记:命令行工具stagefright

 老匹夫 2014-02-22

based on GingerBread
命令行工具stagefright ,源码位于frameworks/base/cmds/stagefright/stagefright.cpp
其用法(可以通过adb在模拟器或手机上执行stagefright -h获得):
# stagefright -h
usage: stagefright
-h(elp)
-a(udio)
-n repetitions
-l(ist) components
-m max-number-of-frames-to-decode in each pass
-b bug to reproduce
-p(rofiles) dump decoder profiles supported
-t(humbnail) extract video thumbnail or album art
-s(oftware) prefer software codec
-o playback audio
-w(rite) filename (write to .mp4 file)
-k seek test

eg:播放SDCARD中的歌曲:
# stagefright -a -s -o /sdcard/music/01天鹅之旅.mp3

当使用t选项时,获取第一帧或专辑图片。它首先通过ServiceManager获取IMediaPlayerService,然后得到retriever;指定源(setDataSource,见行598)后,通过调用retriver的getFrameAtTime(见行600)和extractAlbumArt(见行606)获取图片信息。代码截图如下:

对于CodecCapabilities信息,可以使用如下方式获取:

上面代码用于获取行631~636行所列组件的capability信息,它调用了QueryCodecs去获取capability信息(存放在最后一个实参results中,见行643~645)。
执行示例如下:
# stagefright -p
type ‘video/avc’:
decoder ‘OMX.ST.VFM.H264Dec’ supports 1/2048, 2/2048, 8/2048
decoder ‘AVCDecoder’ supports NOTHING.
type ‘video/mp4v-es’:

TODO:需在行666后加入return语句?

也可以使用-l选项列出列出所有组件。其代码如下,主要是调用了行680的listNodes:

执行示例结果如下:
# stagefright -l
OMX.ST.AFM.BT_MONO_SINK
OMX.ST.AFM.BT_MONO_SOURCE
OMX.ST.AFM.EARPIECE
OMX.ST.AFM.FM_SINK
OMX.ST.AFM.FM_SOURCE
OMX.ST.AFM.IHF
OMX.ST.AFM.MULTI_MIC
OMX.ST.AFM.NOKIA_AV_SINK
OMX.ST.AFM.NOKIA_AV_SOURCE
OMX.ST.AFM.alsasink
OMX.ST.AFM.alsasource
OMX.ST.AFM.audio_3D_mixer
OMX.ST.AFM.binary_splitter
OMX.ST.AFM.binary_splitter_host
OMX.ST.AFM.cscall
OMX.ST.AFM.decoder.aac
OMX.ST.AFM.decoder.aac_host
OMX.ST.AFM.decoder.amrnb
OMX.ST.AFM.decoder.amrwb_host
OMX.ST.AFM.decoder.flac_host
OMX.ST.AFM.decoder.g711_host
OMX.ST.AFM.decoder.g729_host
OMX.ST.AFM.decoder.wma_v9
OMX.ST.AFM.decoder.wmapro_v10
OMX.ST.AFM.encoder.aacenc_host
OMX.ST.AFM.encoder.amrnb
OMX.ST.AFM.encoder.amrwb_host
OMX.ST.AFM.encoder.g711_host
OMX.ST.AFM.encoder.g729_host
OMX.ST.AFM.mixer
OMX.ST.AFM.mixer_host
OMX.ST.AFM.pcmprocessing.audiovirtualizer
OMX.ST.AFM.pcmprocessing.audiovisualization
OMX.ST.AFM.pcmprocessing.channelsynthesis
OMX.ST.AFM.pcmprocessing.chorus
OMX.ST.AFM.pcmprocessing.drc
OMX.ST.AFM.pcmprocessing.equalizer
OMX.ST.AFM.pcmprocessing.mdrc
OMX.ST.AFM.pcmprocessing.noise_reduction
OMX.ST.AFM.pcmprocessing.reverb
OMX.ST.AFM.pcmprocessing.spectrum_analyzer
OMX.ST.AFM.pcmprocessing.spl
OMX.ST.AFM.pcmprocessing.timescale
OMX.ST.AFM.pcmprocessing.transducer_equalizer
OMX.ST.AFM.pcmprocessing.virtualsurround
OMX.ST.AFM.pcmsplitter
OMX.ST.AFM.speech_proc
OMX.ST.AFM.tonegenerator
OMX.ST.ArmIVProc
OMX.ST.ExtHSMCamera
OMX.ST.ExtHSMCamera2
OMX.ST.FACE_DETECTOR
OMX.ST.Fakesource
OMX.ST.HAPTICS_RENDERER.PCM.VIBL
OMX.ST.HAPTICS_RENDERER.PCM.VIBR
OMX.ST.HSMCamera
OMX.ST.HSMCamera2
OMX.ST.ImageSplitter
OMX.ST.ImageSplitter.SEQUENTIAL
OMX.ST.IspProc
OMX.ST.IspProc2
OMX.ST.Norcos
OMX.ST.RedEyeCorrector
OMX.ST.RedEyeDetector
OMX.ST.VFM.H264Dec
OMX.ST.VFM.H264Enc
OMX.ST.VFM.JPEGDec
OMX.ST.VFM.JPEGEnc
OMX.ST.VFM.MPEG2Dec
OMX.ST.VFM.MPEG4Dec
OMX.ST.VFM.MPEG4Enc
OMX.ST.VFM.VAL.Sink
OMX.ST.VFM.VAL.Source
OMX.ST.VFM.VC1Dec
OMX.STE.VISUALPROCESSOR.2D-OPERATIONS.SW
下面的代码则是根据filename名称规则判断是哪种源,用于得到获取不同的MediaSouce:
若源是JPG图片(文件名称后缀包含有.jpg),则创建JPEGSource,直接将其赋值给mediaSource变量,见行711和行719:

若源是随即数经过Sine正弦函数产生,则创建SineSource,直接将其赋值给mediaSource变量见行730:

若不是上述两种情况,则区分是否是RTSP、HTTPLIVE和默认的本地文件三种情况来判断来获取mediaSource。
若源是RTSP,则创建ARTSPController,然后connect,见行743、744:

若源是httplive,则创建LiveSource和NuCachedSource2,见行757和758:

若以上都不是,则使用默认的DataSource(见行690),实际采用的是FileSource:使用默认的Extractor,见行766:

若返回默认的Extrator为空,则程序直接退出。

在上面的三种情形判断中,将Audio和Video数据分离。分离后的数据称之为Track,相对下游的数据处理来说,它仍旧是MediaSource。然后将该mediaSource传递给playSource,用于播放Audio(见行847)。对于写入到mp4文件,则传递给的是mediaSource列表(见行843)。

再来看下播放函数playSource(OMXClient *client, sp<MediaSource> &source)。当发现数据源的数据仍是未解码(不是Raw data)数据时,则使用OMXCodec::Create将这个未解码的数据视作一个新的源,见行78和81,然后调用源的start函数开始工作,见行94。接着创建AudioPlayer(行102),指定OMXCodec返回的源(行103),然后开始播放(行106):

本文链接地址: http://www./?p=1037

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多