中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MediaClock及音視頻同步

發布時間:2020-08-10 15:40:16 來源:網絡 閱讀:843 作者:lindt 欄目:移動開發

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;
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双峰县| 佛冈县| 宿松县| 迁安市| 通化县| 玉门市| 屏南县| 兴国县| 淮安市| 修文县| 滕州市| 商洛市| 伊川县| 邯郸县| 宜春市| 读书| 泰和县| 青铜峡市| 元朗区| 仙居县| 乡城县| 云南省| 迭部县| 弥勒县| 林周县| 定陶县| 黄梅县| 丰县| 清徐县| 石景山区| 武威市| 和平县| 赤峰市| 商都县| 上林县| 余姚市| 玉溪市| 阿拉善右旗| 无极县| 电白县| 若羌县|