免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      FFmpeg音視頻同步

      FFmpeg音視頻同步

      視頻同步在音視頻開發(fā)中是非常重要的知識點(diǎn),所以在這里記錄下音視頻同步相關(guān)知識的理解。

      音視頻同步簡介

      從前面的學(xué)習(xí)可以知道,在一個(gè)視頻文件中,音頻和視頻都是單獨(dú)以一條流的形式存在,互不干擾。那么在播放時(shí)根據(jù)視頻的幀率(Frame Rate)和音頻的采樣率(Sample Rate)通過簡單的計(jì)算得到其在某一Frame(Sample)的播放時(shí)間分別播放,**理論**上應(yīng)該是同步的。但是由于機(jī)器運(yùn)行速度,解碼效率等等因素影響,很有可能出現(xiàn)音頻和視頻不同步,例如出現(xiàn)視頻中人在說話,卻只能看到人物嘴動卻沒有聲音,非常影響用戶觀看體驗(yàn)。

      如何做到音視頻同步?要知道音視頻同步是一個(gè)動態(tài)的過程,同步是暫時(shí)的,不同步才是常態(tài),需要一種隨著時(shí)間會線性增長的量,視頻和音頻的播放速度都以該量為標(biāo)準(zhǔn),播放快了就減慢播放速度;播放慢了就加快播放的速度,在你追我趕中達(dá)到同步的狀態(tài)。目前主要有三種方式實(shí)現(xiàn)同步:

      • 將視頻和音頻同步外部的時(shí)鐘上,選擇一個(gè)外部時(shí)鐘為基準(zhǔn),視頻和音頻的播放速度都以該時(shí)鐘為標(biāo)準(zhǔn)。
      • 將音頻同步到視頻上,就是以視頻的播放速度為基準(zhǔn)來同步音頻。
      • 將視頻同步到音頻上,就是以音頻的播放速度為基準(zhǔn)來同步視頻。

      比較主流的是第三種,將視頻同步到音頻上。至于為什么不使用前兩種,因?yàn)橐话銇碚f,人對于聲音的敏感度更高,如果頻繁地去調(diào)整音頻會產(chǎn)生雜音讓人感覺到刺耳不舒服,而人對圖像的敏感度就低很多了,所以一般都會采用第三種方式。

      復(fù)習(xí)DTS、PTS和時(shí)間基

      • PTS: Presentation Time Stamp,顯示渲染用的時(shí)間戳,告訴我們什么時(shí)候需要顯示
      • DTS: Decode Time Stamp,視頻解碼時(shí)的時(shí)間戳,告訴我們什么時(shí)候需要解碼

      在音頻中PTS和DTS一般相同。但是在視頻中,由于B幀的存在,PTS和DTS可能會不同。

      實(shí)際幀順序:I B B P

      存放幀順序:I P B B

      解碼時(shí)間戳:1 4 2 3

      展示時(shí)間戳:1 2 3 4

      • 時(shí)間基

      /** * This is the fundamental unit of time (in seconds) in terms * of which frame timestamps are represented. * 這是表示幀時(shí)間戳的基本時(shí)間單位(以秒為單位)。**/typedef struct AVRational{ int num; ///< Numerator 分子 int den; ///< Denominator 分母} AVRational;

      時(shí)間基是一個(gè)分?jǐn)?shù),以秒為單位,比如1/50秒,那它到底表示的是什么意思呢?以幀率為例,如果它的時(shí)間基是1/50秒,那么就表示每隔1/50秒顯示一幀數(shù)據(jù),也就是每1秒顯示50幀,幀率為50FPS。

      每一幀數(shù)據(jù)都有對應(yīng)的PTS,在播放視頻或音頻的時(shí)候我們需要將PTS時(shí)間戳轉(zhuǎn)化為以秒為單位的時(shí)間,用來最后的展示。那如何計(jì)算一楨在整個(gè)視頻中的時(shí)間位置?

      static inline double av_q2d(AVRational a){ return a.num / (double) a.den;}//計(jì)算一楨在整個(gè)視頻中的時(shí)間位置timestamp(秒) = pts * av_q2d(st->time_base);

      Audio_Clock

      Audio_Clock,也就是Audio的播放時(shí)長,從開始到當(dāng)前的時(shí)間。獲取Audio_Clock:

      if (pkt->pts != AV_NOPTS_VALUE) { state->audio_clock = av_q2d(state->audio_st->time_base) * pkt->pts;}

      【免費(fèi)分享】整理了一些學(xué)習(xí)資料、教學(xué)視頻和學(xué)習(xí)路線圖,資料包括《Andoird音視頻開發(fā)必備手冊+音視頻學(xué)習(xí)視頻+學(xué)習(xí)文檔資料包+大廠面試真題+2022最新學(xué)習(xí)路線圖》等

      點(diǎn)擊下方鏈接加衛(wèi)星號獲取,領(lǐng)取資料一定要備注來源:“007”,會優(yōu)先通過

      FFmpegWebRTCRTMPRTSPHLSRTP播放器-音視頻流媒體高級開發(fā)

      還沒有結(jié)束,由于一個(gè)packet中可以包含多個(gè)Frame幀,packet中的PTS比真正的播放的PTS可能會早很多,可以根據(jù)Sample Rate 和 Sample Format來計(jì)算出該packet中的數(shù)據(jù)可以播放的時(shí)長,再次更新Audio_Clock。

      // 每秒鐘音頻播放的字節(jié)數(shù) 采樣率 * 通道數(shù) * 采樣位數(shù) (一個(gè)sample占用的字節(jié)數(shù))n = 2 * state->audio_ctx->channels;state->audio_clock += (double) data_size / (double) (n * state->audio_ctx->sample_rate);

      最后還有一步,在我們獲取這個(gè)Audio_Clock時(shí),很有可能音頻緩沖區(qū)還有沒有播放結(jié)束的數(shù)據(jù),也就是有一部分?jǐn)?shù)據(jù)實(shí)際還沒有播放,所以就要在Audio_Clock上減去這部分?jǐn)?shù)據(jù)的播放時(shí)間,才是真正的Audio_Clock。

      double get_audio_clock(VideoState *state) { double pts; int buf_size, bytes_per_sec; //上一步獲取的PTS pts = state->audio_clock; // 音頻緩沖區(qū)還沒有播放的數(shù)據(jù) buf_size = state->audio_buf_size – state->audio_buf_index; // 每秒鐘音頻播放的字節(jié)數(shù) bytes_per_sec = state->audio_ctx->sample_rate * state->audio_ctx->channels * 2; pts -= (double) buf_size / bytes_per_sec; return pts;}

      get_audio_clock中返回的才是我們最終需要的Audio_Clock,當(dāng)前的音頻的播放時(shí)長。

      Video_Clock

      Video_Clock,視頻播放到當(dāng)前幀時(shí)的已播放的時(shí)間長度。

      avcodec_send_packet(state->video_ctx, packet);while (avcodec_receive_frame(state->video_ctx, pFrame) == 0) { if ((pts = pFrame->best_effort_timestamp) != AV_NOPTS_VALUE) { } else { pts = 0; } pts *= av_q2d(state->video_st->time_base); // 時(shí)間基換算,單位為秒 pts = synchronize_video(state, pFrame, pts); av_packet_unref(packet);}

      舊版的FFmpeg使用av_frame_get_best_effort_timestamp函數(shù)獲取視頻的最合適PTS,新版本的則在解碼時(shí)生成了best_effort_timestamp。但是依然可能會獲取不到正確的PTS,所以在synchronize_video中進(jìn)行處理。

      double synchronize_video(VideoState *state, AVFrame *src_frame, double pts) { double frame_delay; if (pts != 0) { state->video_clock = pts; } else { pts = state->video_clock;// PTS錯誤,使用上一次的PTS值 } //根據(jù)時(shí)間基,計(jì)算每一幀的間隔時(shí)間 frame_delay = av_q2d(state->video_ctx->time_base); //解碼后的幀要延時(shí)的時(shí)間 frame_delay += src_frame->repeat_pict * (frame_delay * 0.5); state->video_clock += frame_delay;//得到video_clock,實(shí)際上也是預(yù)測的下一幀視頻的時(shí)間 return pts;}

      同步

      上面兩步獲得了Audio_Clock和Video_Clock,這樣我們就有了視頻流中Frame的顯示時(shí)間,并且得到了作為基準(zhǔn)時(shí)間的音頻播放時(shí)長Audio clock ,可以將視頻同步到音頻了。

    1. 用當(dāng)前幀的PTS – 上一播放幀的PTS得到一個(gè)延遲時(shí)間
    2. 用當(dāng)前幀的PTS和Audio_Clock進(jìn)行比較,來判斷視頻的播放速度是快了還是慢了
    3. 根據(jù)2的結(jié)果,設(shè)置播放下一幀的延遲時(shí)間
    4. #define AV_SYNC_THRESHOLD 0.01 // 同步最小閾值#define AV_NOSYNC_THRESHOLD 10.0 // 不同步閾值double actual_delay, delay, sync_threshold, ref_clock, diff;// 當(dāng)前Frame時(shí)間減去上一幀的時(shí)間,獲取兩幀間的延時(shí)delay = vp->pts – is->frame_last_pts;if (delay = 1.0) { // 延時(shí)小于0或大于1秒(太長)都是錯誤的,將延時(shí)時(shí)間設(shè)置為上一次的延時(shí)時(shí)間 delay = is->frame_last_delay;}// 獲取音頻Audio_Clockref_clock = get_audio_clock(is);// 得到當(dāng)前PTS和Audio_Clock的差值diff = vp->pts – ref_clock;sync_threshold = (delay > AV_SYNC_THRESHOLD) ? delay : AV_SYNC_THRESHOLD;// 調(diào)整播放下一幀的延遲時(shí)間,以實(shí)現(xiàn)同步if (fabs(diff) frame_timer += delay;// 最終真正要延時(shí)的時(shí)間actual_delay = is->frame_timer – (av_gettime() / 1000000.0);if (actual_delay < 0.010) { // 延時(shí)時(shí)間過小就設(shè)置個(gè)最小值 actual_delay = 0.010;}// 根據(jù)延時(shí)時(shí)間刷新視頻schedule_refresh(is, (int) (actual_delay * 1000 + 0.5));

      最后

      將視頻同步到音頻上實(shí)現(xiàn)音視頻同步基本完成,總體就是動態(tài)的過程快了就等待,慢了就加速,在一個(gè)你追我趕的狀態(tài)下實(shí)現(xiàn)同步播放。

      后面的博客會持續(xù)更新真正實(shí)現(xiàn)一個(gè)音視頻同步的播放器。

      分享一個(gè)非常好的音視頻學(xué)習(xí)地址,可點(diǎn)擊免費(fèi)報(bào)名訂閱學(xué)習(xí),先關(guān)注不迷路。[給力]

      【免費(fèi)】FFmpeg/WebRTC/RTMP/NDK/Android音視頻流媒體高級開發(fā)-學(xué)習(xí)視頻教程-騰訊課堂

      鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
      (0)
      用戶投稿
      上一篇 2022年6月20日 09:10
      下一篇 2022年6月20日 09:11

      相關(guān)推薦

      • 「婦產(chǎn)科普」胎盤位置低,還能長上去嗎?

        聊一聊前置胎盤那些事兒 一.前置胎盤 門診的時(shí)候,不少孕媽媽拿著超聲單子疑惑,啥叫胎盤位置低,啥叫前置胎盤? 前置胎盤是指胎盤組織覆蓋宮頸內(nèi)口,將來可能會導(dǎo)致大量出血、早產(chǎn)及需要剖…

        2022年8月19日
      • 人到中年,要學(xué)會在這幾個(gè)人面前,保持沉默

        文/夏莫 01、卷首語 沉默,是一種態(tài)度。 人與人之間,語言,能夠傳遞內(nèi)心的想法以及感受。但是,有時(shí)并不是說得越多就越好。 學(xué)會閉嘴,學(xué)會保持沉默,也是一種交際方式。 聰明的人,在…

        2022年8月18日
      • 前國足隊(duì)長出售豪宅,要價(jià)1.45億,要求:身價(jià)不夠5000萬不配看房

        近段時(shí)間,有網(wǎng)友在一個(gè)叫僑鑫匯悅臺的廣州高檔住宅區(qū),看到了幾十名房產(chǎn)經(jīng)紀(jì)人的身影。看起來,他們應(yīng)該是前去詢問一套豪宅的具體信息,然后推給手頭的意向客戶。據(jù)了解,這套豪宅的主人是前恒…

        2022年7月20日
      • 元宇宙和web3.0,誰是互聯(lián)網(wǎng)的未來式?

        元宇宙和Web3.0都是最近較為高頻的詞匯,由于兩者都是互聯(lián)網(wǎng)的未來潛在形式,這也使得人們對兩者誰是互聯(lián)網(wǎng)的未來而喋喋不休。但很遺憾的是兩者的概念并不相同,因此將二者放在相互對立的…

        2022年6月28日
      • 本人目前大三??粕?,想?yún)⒓訉I?,但是學(xué)校說只能自考,本人又不是很想自考怎么辦?

        ??粕究疲肋€是有多種的。一種就是你說的自考,需要自己一門門的考過,然后才能畢業(yè)拿到證書,這種是不需要??飘厴I(yè)證書就可以報(bào)考的,只要申請畢業(yè)時(shí)有??飘厴I(yè)證書就行。 還有一種就是…

        2022年7月16日
      • 金融科技能否通過開放式銀行API建立可行業(yè)務(wù)?

        【中國金融案例中心 編譯:葉子】 開放式銀行API的誕生以及政府的關(guān)注使得開放式銀行API得到了前所未有的發(fā)展。由于辦理高效、用戶便捷等優(yōu)勢,這種業(yè)務(wù)已經(jīng)成為未來金融科技的發(fā)展方向…

        2022年6月20日
      • 國產(chǎn)軟件自主化加速助力數(shù)智化轉(zhuǎn)型

        來源:人民網(wǎng) 原創(chuàng)稿 人民網(wǎng)北京6月13日電(焦磊)近年來,數(shù)字經(jīng)濟(jì)浪潮席卷全球,我國數(shù)字經(jīng)濟(jì)也進(jìn)入快速發(fā)展階段。加快推進(jìn)企業(yè)數(shù)字化轉(zhuǎn)型,有利于構(gòu)建全鏈條數(shù)字化生態(tài),增強(qiáng)產(chǎn)業(yè)鏈、供…

        2022年6月14日
      • 性能再破世界紀(jì)錄 華中科大圖計(jì)算機(jī)登頂全球榜單

        6月4日,記者從華中科技大學(xué)獲悉,國際超級計(jì)算大會日前在德國漢堡舉辦,第24屆Graph 500排名揭曉,該校圖計(jì)算團(tuán)隊(duì)研發(fā)的圖計(jì)算機(jī)DepGraph性能再次打破圖計(jì)算性能世界紀(jì)錄…

        2022年6月13日
      • 40歲再出發(fā)|50個(gè)微習(xí)慣助你一年后脫胎換骨

        如何毫不費(fèi)力的變美、變優(yōu)秀、變瘦?如何變自信、愛上自己? 培根說:“習(xí)慣真是一種頑強(qiáng)而巨大的力量,它可以主宰人的一生。” 把這20個(gè)微習(xí)慣融入到生活中,相信我,一年后,你會自律上癮…

        2022年8月24日
      • 《霍格沃茨之遺》游戲捏臉畫面首曝

        一組《霍格沃茨之遺》的游戲截圖近日在Reddit曝光,是關(guān)于本游戲的捏臉和自定義系統(tǒng),從圖中可以看出,游戲提供了數(shù)十種發(fā)型、臉型以及服裝供你選擇。 《霍格沃茨之遺》是一款基于《哈利…

        2022年8月7日

      聯(lián)系我們

      聯(lián)系郵箱:admin#wlmqw.com
      工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息