总结:Audio更新锚点时间
1、当前正在播放的媒体时间
= 当前正在写入到AudioTrack的数据的媒体时间 - 已经写入到AudioTrack但是还没有播放的数据的持续时间
2、已经写入但是还没有播放的数据持续时间
= 已经写入的数据的持续时间 - 当前已经播放的数据持续时间
3、已经写入的数据的持续时间
= 写入AudioTrack帧 × 采样率 × 声道数
4、当前已经播放的数据持续时间(gettimtstamp)
= 当前媒体时间 + (nowtime - 媒体播放到系统的时间)
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帧