StageFright学习笔记(1)

StageFright的目录所在:2.3.3_src/frameworks/base/media/libstagefright中。

1.Video Playback的流程。

stagefright中AwesomePlayer可用来播放音视频。AwesomePlayer提供许多API,可以让上层的应用程序来调用。

在Stagefright中,播放音视频的处理流程如下。

(1)将档案的绝对路径指定给mUri


status_t AwesomePlayer::setDataSource(const char* uri, ...)
{
  return setDataSource_l(uri, ...);
}

status_t AwesomePlayer::setDataSource_l(const char* uri, ...)
{
  mUri = uri;
}

(2)启动mQueue,作为event handler

status_t AwesomePlayer::prepare()
{
  return prepare_l();
}

status_t AwesomePlayer::prepare_l()
{
  prepareAsync_l();

  while (mFlags & PREPARING)
  
{
   
mPreparedCondition.wait(mLock);
  }
}

status_t AwesomePlayer::prepareAsync_l()
{
  mQueue.start();

  mFlags |= PREPARING;
  mAsyncPrepareEvent = new AwesomeEvent(
                             this
                             &AwesomePlayer::onPrepareAsyncEvent);
  mQueue.postEvent(mAsyncPrepareEvent);
}


(3) onPrepareAsyncEvent被触发。

void AwesomePlayer::onPrepareAsyncEvent()
{
  finishSetDataSource_l();

  initVideoDecoder(); ...... (3.3)
  initAudioDecoder();

}

status_t AwesomePlayer::finishSetDataSource_l()
{
  dataSource = DataSource::CreateFromURI(mUri.string(), ...);
  sp<MediaExtractor> extractor =
                     MediaExtractor::Create(dataSource); ..... (3.1)

  return setDataSource_l(extractor); ......................... (3.2)
}

(3.1)解析mUri所指定的文件,并且根据其header来选择extractor(解析器)

sp<MediaExtractor> MediaExtractor::Create(const sp<DataSource> &source, ...)
{
  source->sniff(&tmp, ...);
  mime = tmp.string();

  
if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG4)
  
{
    return new MPEG4Extractor(source);
  }
  
else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG))
  
{
    return new MP3Extractor(source);
  }
  
else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)
  
{
    return new AMRExtractor(source);
  }
}

(3.2)使用extractor对文件做音视频分离。(mVideo Track/mAudio Track)

status_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor)
{
  for (size_t i = 0; i < extractor->countTracks(); ++i)
  {
    sp<MetaData> meta = extractor->getTrackMetaData(i);

    CHECK(meta->findCString(kKeyMIMEType, &mime));

    if (!haveVideo && !strncasecmp(mime, "video/", 6))
    {
      setVideoSource(extractor->getTrack(i));
      haveVideo = true;
    }
    else if (!haveAudio && !strncasecmp(mime, "audio/", 6))
    {
      setAudioSource(extractor->getTrack(i));
      haveAudio = true;

    }
  }
}

void AwesomePlayer::setVideoSource(sp<MediaSource> source)
{
  mVideoTrack = source;
}


(3.3)根据mVideoTrack中的编码类型来选择视频解码器。

status_t AwesomePlayer::initVideoDecoder()
{
  mVideoSource = OMXCodec::Create(mClient.interface(),
                                  mVideoTrack->getFormat(),
                                  false,
                                  mVideoTrack
);

}

(4)将mVideoEvent放入mQueue中,开始解码播放,并交给mVideoRenderer来画出。、


status_t AwesomePlayer::play()
{
  return play_l();
}

status_t AwesomePlayer::play_l()
{
  postVideoEvent_l();
}

void AwesomePlayer::postVideoEvent_l(int64_t delayUs)
{
  mQueue.postEventWithDelay(mVideoEvent, delayUs);
}

void AwesomePlayer::onVideoEvent()
{
  mVideoSource->read(&mVideoBuffer, &options);
  [Check Timestamp]
  mVideoRenderer->render(mVideoBuffer);

  postVideoEvent_l();
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值