NuPlayer audio video 同步

总结: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帧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值