打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
stagefright框架(一)Video Playback的流程
在Android上,预设的多媒体框架(multimedia framework)是OpenCore。OpenCore的优点是兼顾了跨平台的移植性,而且已经经过多方验证,所以相对来说较为稳定;但是其缺点是过于庞大复杂,需要耗费相当多的时间去维护。从Android 2.0开始,Google引进了架构稍为简洁的Stagefright,并且有逐渐取代OpenCore的趋势(注1)。

[图1]Stagefright在Android多媒体架构中的位置。

[图2] Stagefright所涵盖的模组(注2)。
以下我们就先来看看Stagefright是如何播放一个影片档。

Stagefright在Android中是以shared library的形式存在(libstagefright.so),其中的module -- AwesomePlayer可用来播放Video/Audio(注3)。AwesomePlayer提供许多API,可以让上层的应用程序(Java/JNI)来呼叫,我们以一个简单的程式来说明Video Playback的流程。

在Java中,若要播放一个影片档,我们会这样写:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE); ...... (1)
mp.prepare(); ........................ (2)(3)
mp.start(); .......................... (4)

在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对档案做A/V的分离(mVideoTrack/mAudioTrack)

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中的编码类型来选择video decoder(mVideoSource)

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();
}




(注1) 从Android2.3(Gingerbread)开始,预设的多媒体框架为Stagefright。
(注2) Stagefright的架构尚不断的演进中,本系列文章并未含括所有的模组。
(注3) Audio的播放是交由AudioPlayer来处理,请参考《Stagefright(6) - Audio Playback的流程》。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
stagefright框架
StageFright框架流程解读
[整理]Stagefright框架中视频播放流程
opencore and stagefright
Android-StageFright之decode
Android stagefright decoder
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服