1、audio根據當前播放 更新錨點時間
void MediaClock::updateAnchor(int64_t anchorTimeMediaUs,
int64_t anchorTimeRealUs, int64_t maxTimeMediaUs)
{
// 獲得當前的系統時間, 可能與anchorTimeRealUs有差別
int64_t nowUs = ALooper::GetNowUs();
// 獲得當前正在播放的媒體時間 nowMediaUs
int64_t nowMediaUs =
anchorTimeMediaUs + (nowUs - anchorTimeRealUs) * (double)mPlaybackRate;
// 更新當前播放的媒體時間爲錨點媒體時間
// 更新當前系統時間爲錨點系統時間
mAnchorTimeRealUs = nowUs;
mAnchorTimeMediaUs = nowMediaUs;
}
2、video向audio對齊
//根據video錨點時間計算video正在播放幀的時間
status_t MediaClock::getMediaTime_l(
int64_t realUs, int64_t *outMediaUs, bool allowPastMaxTime)
//realus當前系統時間,mediaUs 當前Audio正在播放的媒體時間, 對應video正在播放的媒體時間
int64_t mediaUs = mAnchorTimeMediaUs
+ (realUs - mAnchorTimeRealUs) * (double)mPlaybackRate; //播放倍率對時間的影響
*outMediaUs = mediaUs;
//計算當前處理幀的顯示時間
status_t MediaClock::getRealTimeFor(int64_t targetMediaUs, int64_t *outRealUs)
int64_t nowUs = ALooper::GetNowUs();
(1) nowMediaUs video正在播放的媒體時間, nowUs對應的媒體時間
getMediaTime_l(nowUs, &nowMediaUs, true /* allowPastMaxTime */);
(2) 計算出Buffer的顯示時間
// outMediaUs video正在播放的媒體時間, nowUs對應的媒體時間,targetMediaUs解碼幀自帶時間
*outRealUs = (targetMediaUs - nowMediaUs) / (double)mPlaybackRate + nowUs; //播放倍率對時間的影響
...
>40000 drop video幀