Android多媒体开发【8】-- AwesomePlayer基本框架及播放流程

 

原文链接地址:http://blog.csdn.net/tx3344/article/details/8084912点击打开链接

 

 

 




1.通过setDataSource 指定播放器的数据源。可以是URI或者fd.可以是http:// 、rtsp://、本地地址或者本地文件描述符fd。其最终调用是将上层传递来的参数转化为DataSource,为下一步的demux提供数据支持。

2.在真正Prepare功能函数onPrepareAsyncEvent()会调用finishSetDataSource_l。通过第一步产生的DataSource来生成extractor,因为封装的格式很多,所以需要通过DataSource的信息,去创建不同的extractor。

[cpp]   view plain copy
  1. extractor = MediaExtractor::Create(  
  2.                 dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str());  
[cpp]   view plain copy
  1. if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4)  
  2.         || !strcasecmp(mime, "audio/mp4")) {  
  3.     ret = new MPEG4Extractor(source);  
  4. else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {  
  5.     ret = new MP3Extractor(source, meta);  
  6. else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)  
  7.         || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {  
  8.     ret = new AMRExtractor(source);  
  9. else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) {  
  10.     ret = new FLACExtractor(source);  
  11. else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WAV)) {  
  12.     ret = new WAVExtractor(source);  
  13. else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_OGG)) {  
  14.     ret = new OggExtractor(source);  
  15. else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MATROSKA)) {  
  16.     ret = new MatroskaExtractor(source);  
  17. else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) {  
  18.     ret = new MPEG2TSExtractor(source);  
  19. else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_WVM)) {  
  20.     // Return now.  WVExtractor should not have the DrmFlag set in the block below.  
  21.     return new WVMExtractor(source);  
  22. else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC_ADTS)) {  
  23.     ret = new AACExtractor(source, meta);  
  24. else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2PS)) {  
  25.     ret = new MPEG2PSExtractor(source);  
  26. }  

3.得到extractor之后,通过setVideoSource() setAudioSource()产生独立的mVideoTrack(视频)、mAudioTrack(音频)数据流,分别为音视频解码器提供有各自需要的数据流。

其实extractor和mVideoTrack、mAudioTrack就组成了播放器模型中的demuxer部分。把封装格式里面的音视频流拆分出来,分别的送给音视频解码器。

4.接下来就是initVideoDecoder() initAudioDecoder().依赖上面产生的mVideoTrack(视频)、mAudioTrack(音频)数据流。生成了mVideoSource和mAudioSource这两个音视频解码器。不同类型匹配不同的解码器。

[cpp]   view plain copy
  1. mVideoSource = OMXCodec::Create(  
  2.             mClient.interface(), mVideoTrack->getFormat(),  
  3.             false// createEncoder  
  4.             mVideoTrack,  
  5.             NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);  
  6.  mAudioSource = OMXCodec::Create(  
  7.                 mClient.interface(), mAudioTrack->getFormat(),  
  8.                 false// createEncoder  
  9.                 mAudioTrack);  
  10.     }  

mVideoSource、mAudioSource组成了播放器模型中的decoder部分。

android系统中的编解码器部分用的是openmax,以后会深入了解。openma x是一套标准接口,各家硬件厂商都可以遵循这个标准来做自己的实现,发挥自己芯片特性。然后提供给android系统来用。因为大部分的机顶盒芯片产品硬件的编解码是它的优势,可以把这种优势完全融入到android平台中。以后手机高清视频硬解码也会是个趋势。

5.解码完之后的数据就要输出了。AwesomePlayer分别用了mVideoRenderer做视频输出、mAudioPlayer做音频输出。他们分别调用android图像和音频的相关服务。这俩部分是android平台中十分重要的2块,以后会深入了解。

mVideoRenderer和mAudioPlayer就组成了播放器中output的部分。


综上AwesomePlayer的整体框架和流程就清晰了,其实也脱离不了DataSource、demux、decoder、output这4大部分。接下来会分别了解每个部分是怎么实现的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值