您好,登錄后才能下訂單哦!
Nuplayer中音視頻同步主要依靠MediaClock中記錄的錨點時間,所以先看下MediaClock類
1,1
MediaClock::MediaClock() ????:?mAnchorTimeMediaUs(-1), ??????mAnchorTimeRealUs(-1), ??????mMaxTimeMediaUs(INT64_MAX), ??????mStartingTimeMediaUs(-1), ??????mPlaybackRate(1.0)?{ }
1.2錨點時間更新
void?MediaClock::updateAnchor( int64_t?anchorTimeMediaUs, int64_t?anchorTimeRealUs, int64_t?maxTimeMediaUs)?{ ????Mutex::Autolock?autoLock(mLock); ????int64_t?nowUs?=?ALooper::GetNowUs(); ????int64_t?nowMediaUs?= ????anchorTimeMediaUs?+?(nowUs?-?anchorTimeRealUs)?*?(double)mPlaybackRate;?//mPlaybackRate是播放倍速 ????//下面這段是超過閾值的保護??? ????if?(mAnchorTimeRealUs?!=?-1)?{ ????int64_t?oldNowMediaUs?= ????mAnchorTimeMediaUs?+?(nowUs?-?mAnchorTimeRealUs)?*?(double)mPlaybackRate; ????if?(nowMediaUs?<?oldNowMediaUs ????&&?nowMediaUs?>?oldNowMediaUs?-?kAnchorFluctuationAllowedUs)?{ ????return; ????} ????} ????//mAnchorTimeRealUs??當前系統時間,錨點real系統時間戳,可以理解為最后一幀播放的時間,對應到系統時鐘后的時間。 ????//mAnchorTimeMediaUs???為錨點媒體時間戳,可以理解為從最開始播放時記錄下來的第一個媒體時間戳,一直到當前正在播放這一幀的總時長,但是它主要將音頻pts與系統時鐘做了統一,即將音頻同步到系統時鐘上。 ????在這函數里面只是考慮到函數調用的耗時,將這個耗時加到mAnchorTimeMediaUs?而已,本質還是直接記錄傳入的2個入參時間 ????mAnchorTimeRealUs?=?nowUs; ????mAnchorTimeMediaUs?=?nowMediaUs; }
??
?1.3從別人鏈接處摘錄的解釋
realTimeUs = PTS - nowMediaUs + nowUs? ? ??
getRealTimeFor
= PTS - (mAnchorTimeMediaUs + (nowUs - mAnchorTimeRealUs)) + nowUs
mAnchorTimeMediaUs + (nowUs - mAnchorTimeRealUs)? 是在
getMediaTime_l中計算
mAnchorTimeMediaUs錨點媒體時間戳,可以理解為最開始播放的時候記錄下來的第一個媒體時間戳
mAnchorTimeRealUs錨點real系統時間戳,
nowUs - mAnchorTimeRealUs即為從開始播放到現在,系統時間經過了多久。? ??
這個時間再加上mAnchorTimeMediaUs,即為“在當前系統時間下,對應的媒體時間戳”,
用PTS減去這個時間,表示“還有多久該播放這一幀”。
最后再加上一個系統時間,即為這一幀應該顯示的時間。
---------------------?
作者:zhanghui_cuc?
來源:CSDN?
原文:https://blog.csdn.net/nonmarking/article/details/78746671?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
實際就是根據codec解出來的PTS, 然后比較音頻的錨點值,計算出來當前這視頻幀應當延遲多久post,錨點時間是在每個音頻幀時都計算的,按我自己理解是
(nowUs - mAnchorTimeRealUs) 是距離上個音頻幀播放有多久
mAnchorTimeMediaUs + (nowUs - mAnchorTimeRealUs)? 是對應音頻幀應該播放的視頻幀時間戳
PTS - (mAnchorTimeMediaUs + (nowUs - mAnchorTimeRealUs)) + nowUs? 這個是PTS-真正要播放的視頻幀時間戳 計算出該視頻幀要延遲多久 再加上當前時間得到絕對時間
mMediaClock->getRealTimeFor(mediaTimeUs,?&realTimeUs)?==?OK delayUs?=?realTimeUs?-?nowUs; msg->setWhat(kWhatPostDrainVideoQueue); msg->post(postDelayUs);
//?targetMediaUs?PTS???outRealUs?出參,實際要播放時刻 status_t?MediaClock::getRealTimeFor( int64_t?targetMediaUs,?int64_t?*outRealUs)?const?{ ????int64_t?nowUs?=?ALooper::GetNowUs(); ????int64_t?nowMediaUs; ????status_t?status?= ????getMediaTime_l(nowUs,?&nowMediaUs,?true?/*?allowPastMaxTime?*/); ????if?(status?!=?OK)?{ ????return?status; ????} ????*outRealUs?=?(targetMediaUs?-?nowMediaUs)?/?(double)mPlaybackRate?+?nowUs; ????return?OK; } status_t?MediaClock::getMediaTime_l( int64_t?realUs,?int64_t?*outMediaUs,?bool?allowPastMaxTime)?const?{ ????int64_t?mediaUs?=?mAnchorTimeMediaUs ????+?(realUs?-?mAnchorTimeRealUs)?*?(double)mPlaybackRate; ????if?(mediaUs?>?mMaxTimeMediaUs?&&?!allowPastMaxTime)?{ ????mediaUs?=?mMaxTimeMediaUs; ????} ????if?(mediaUs?<?mStartingTimeMediaUs)?{ ????mediaUs?=?mStartingTimeMediaUs; ????} ????if?(mediaUs?<?0)?{ ????mediaUs?=?0; ????} ????*outMediaUs?=?mediaUs; ????return?OK; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。