博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
stagefright框架(七)-Audio和Video的同步
阅读量:6293 次
发布时间:2019-06-22

本文共 1481 字,大约阅读时间需要 4 分钟。

讲完了audio和video的处理流程,接下来要看的是audio和video同步化(synchronization)的问题。OpenCORE的做法是设置一个主clock,而audio和video就分别以此作为输出的依据。而在Stagefright中,audio的输出是透过callback函式来驱动,video则根据audio的timestamp来做同步。以下是详细的说明:

(1) 当callback函式驱动AudioPlayer读取解码后的资料时,AudioPlayer会取得两个时间戳 -- mPositionTimeMediaUs和mPositionTimeRealUs

size_t AudioPlayer::fillBuffer(data, size)
{


  ...

  mSource->read(&mInputBuffer...);

  mInputBuffer->meta_data()->findInt64(kKeyTime&mPositionTimeMediaUs);
  mPositionTimeRealUs ((mNumFramesPlayed + size_done / mFrameSize* 1000000/ mSampleRate;

  ...
}


mPositionTimeMediaUs是资料里面所载明的时间戳(timestamp);mPositionTimeRealUs则是播放此资料的实际时间(依据frame number及sample rate得出)。

(2) Stagefright中的video便依据从AudioPlayer得出来之两个时间戳的差值,作为播放的依据


void AwesomePlayer::onVideoEvent()
{


  ...

  mVideoSource->read(&mVideoBuffer...);
  mVideoBuffer->meta_data()->findInt64(kKeyTime&timeUs);

  mAudioPlayer->getMediaTimeMapping(&realTimeUs&mediaTimeUs);
  mTimeSourceDeltaUs = realTimeUs - mediaTimeUs;

  nowUs = ts->getRealTimeUs(- mTimeSourceDeltaUs;
  latenessUs = nowUs - timeUs;

  ...
}


AwesomePlayer从AudioPlayer取得realTimeUs(即mPositionTimeRealUs)和mediaTimeUs(即mPositionTimeMediaUs),并算出其差值mTimeSourceDeltaUs。
(3) 最后我们将该video资料做排程

 

void AwesomePlayer::onVideoEvent()
{


  ...
  if (latenessUs > 40000)
  {

    mVideoBuffer->release();
    mVideoBuffer NULL;

    postVideoEvent_l();
    return;
  }
  if (latenessUs -10000)
  {

    postVideoEvent_l(10000);
    return;
  }

  mVideoRenderer->render(mVideoBuffer);

  ...
}

转载于:https://www.cnblogs.com/shakin/p/4097124.html

你可能感兴趣的文章
简单易懂的谈谈 javascript 中的继承
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>