现在的位置: 首页 > 综合 > 正文

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

2013年11月08日 ⁄ 综合 ⁄ 共 1683字 ⁄ 字号 评论关闭
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) ; 

  . . . 
} 

抱歉!评论已关闭.