stagefright框架(七)-Audio和Video的同步

stagefright框架(七)-Audio和Video的同步 
 
 
講完了 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) ; 

  . . . 
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值