1. 程式人生 > >從零開始學習音視訊程式設計技術(八)FFMPEG Qt視訊播放器之音視訊同步

從零開始學習音視訊程式設計技術(八)FFMPEG Qt視訊播放器之音視訊同步

前面分別講解了:

現在我們就將視訊和音訊合併,並讓聲音和畫面同步。

加入音訊的部分就不做講解了,這裡主要講下聲音和視訊同步的步驟。

首先剛開始播放的時候通過av_gettime()獲取系統主時鐘,記錄下來。

以後便不斷呼叫av_gettime()獲取系統時鐘 減去之前記錄下的差值,便得到了一個視訊播放了多久的實際時間。

對於視訊的同步我們這樣做:

從視訊讀取出的資料中包含一個pts的資訊(每一幀影象都會帶有pts的資訊,pts就是播放視訊的時候此影象應該顯示的時間)。 這樣只需要使用pts和前面獲取的時間進行對比,pts比實際時間大,就呼叫sleep函式等一等,否則就直接播放出來。這樣就達到了某種意義上的同步了。

而對於音訊:

從前面使用SDL的例子,其實就能夠發現一個現象:我們讀取音訊的執行緒差不多就是瞬間讀完放入佇列的,但是音訊播放速度卻是正常的,並不是一下子播放完畢。因此可以看出,在音訊播放上,SDL已經幫我們做了處理了,只需要將資料直接交給SDL就行了。

視訊部分同步程式碼大致如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 int64_t start_time = av_gettime();     int64_t pts = 0; //當前視訊的pts while (1) { if (av_read_frame(pFormatCtx, packet) < 0) { break//這裡認為視訊讀取完了 } int64_t realTime = av_gettime() - start_time; //主時鐘時間 while(pts > realTime) { SDL_Delay(10); realTime = av_gettime() - start_time; 
//主時鐘時間 } if (packet->stream_index == videoStream) { ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture,packet); if (packet->dts == AV_NOPTS_VALUE && pFrame->opaque&& *(uint64_t*) pFrame->opaque != AV_NOPTS_VALUE) { pts = *(uint64_t *) pFrame->opaque; } else if (packet->dts != AV_NOPTS_VALUE) { pts = packet->dts; }

相關推薦

開始學習視訊程式設計技術FFMPEG Qt視訊播放視訊同步

前面分別講解了: 現在我們就將視訊和音訊合併,並讓聲音和畫面同步。 加入音訊的部分就不做講解了,這裡主要講下聲音和視訊同步的步驟。 首先剛開始播放的時候通過av_gettime()獲取系統主時鐘,記錄下來。 以後便不斷呼叫av_gettime()獲取系統時鐘

開始學習視訊程式設計技術 FFMPEG Qt視訊播放SDL的使用

前面介紹了使用FFMPEG+Qt解碼視訊並顯示。 現在我們就著手給它加上聲音播放。 播放聲音有很多種方式: 以windows系統為例,可以使用如下方法播放音訊: 1.直接呼叫系統API的wavein、waveout等函式 2.使用directsound播放

開始學習視訊程式設計技術 FFMPEG的使用

零開始學習音視訊程式設計技術(四) FFMPEG的使用  音視訊開發中最常做的就是編解碼的操作了,以H.264為例:如果想要自己實現編碼h.264,需要對H.264非常的瞭解,首先需要檢視H.264的文件,這個文件好像說是三百多頁(本人並沒有看過)。 想到這

開始學習比特幣開發-P2P網路建立流程生成地址對並連線到指定地址

本節繼續講解比特幣P2P網路建立流程,這節講解的執行緒為’ThreadOpenAddedConnections’,它的作用是生成地址對並連線到指定地址。 本文可以結合比特幣系統啟動的的第12步的講解來看,可以更加系統的瞭解比特幣系統啟動的過程。 P2P 網路的建立是在比特幣系統啟動的第

開始學習比特幣開發--網路初始化,載入區塊鏈和錢包,匯入區塊啟動節點

寫在前面: 本篇文章接續 從零開始學習區塊鏈技術(三)-接入比特幣網路的關鍵步驟解析、建立比特幣錢包,以及重要rpc指令 從零開始學習區塊鏈技術(二)–如何接入比特幣網路以及其原理分析 以及從零開始學習區塊鏈技術(一)–從原始碼編譯比特幣 如果這篇文章看不明白,請務必先閱讀之前的文章

開始學習微信小程式

wx.navigateTo()與wx.redirectTo()的區別 區別一 wx.navigateTo()表示的是從一個頁面跳轉到另一個頁面,會在另一個頁面中出現可返回之前頁面的按鈕,另一個頁面與之前頁面的關係為子頁面與父頁面的關係 wx.redirectTo()表示

開始學習比特幣開發--P2P 網路建立訊息處理中篇

P2P 網路的建立是在系統啟動的第 12 步,最後時刻呼叫 CConnman::Start 方法開始的。 恭喜你越來越接近比特幣的核心了,在上篇中,我們主要講解了比特幣的訊息處理執行緒,接下來,在下篇中,將以具體的比特幣訊息即比特幣協義分析為主。針對比特幣的協義

開始學習視訊程式設計技術 視訊格式講解學習筆記

/*  該型別部落格為學習時載錄筆記,加上自己對一些不理解部分自己的理解。會涉及其他博主的博文的摘錄,會標註出處  */ ==========================================================================

開始學習視訊程式設計技術 音訊格式講解

1. 音訊簡介     前面我們說過視訊有一個每秒鐘採集多少張的概念,這就叫做視訊的幀率。     和視訊的幀率一樣的道理,聲音也有一個頻率,叫做取樣率。   人對頻率的識別範圍是 20HZ - 20000HZ, 如果每秒鐘能對聲音做 20000 個取樣, 回放

開始學習視訊程式設計技術 視訊格式講解

所謂視訊,其實就是將一張一張的圖片連續的放出來,就像放幻燈片一樣,由於人眼的惰性,因此只要圖片的數量足夠多,就會覺得是連續的動作。 所以,只需要將一張一張的圖片儲存下來,這樣就可以構成一個視訊了。      但是,由於目前網路和儲存空間的限制,直接儲存圖片顯然不可行。

開始學習視訊程式設計技術35 windows下編譯並除錯ffmpeg

前面介紹了Linux下編譯ffmpeg的方法,考慮到大部分時候測試ffmpeg功能都是使用的windows系統(至少我是這樣的),因此將戰場重新轉移到windows上。    前面寫了那麼多的程式碼,但都只是簡單的呼叫了ffmpeg的API,並不知道他內部是如何實現的。如果可

【轉】開始學習視訊程式設計技術 音訊格式講解

轉自:http://blog.yundiantech.com/?log=blog&id=5 1. 音訊簡介     前面我們說過視訊有一個每秒鐘採集多少張的概念,這就叫做視訊的幀率。     和視訊的幀率一樣的道理,聲音也有一個頻率,叫做取樣率。   

【轉】開始學習視訊程式設計技術 視訊格式講解

轉自:http://blog.yundiantech.com/?log=blog&id=4  所謂視訊,其實就是將一張一張的圖片連續的放出來,就像放幻燈片一樣,由於人眼的惰性,因此只要圖片的數量足夠多,就會覺得是連續的動作。 所以,只需要將一張一張的圖片儲存下來

開始學習視訊程式設計技術34 Linux篇編譯ffmpeg

 水了這麼多篇,是時候開始幹正事了。Linux基礎知識已經掌握了,現在可以開始編譯ffmpeg了:一、下載ffmpeg首先下載ffmpeg的原始碼,ffmpeg所有版本原始碼下載地址:截至本文編寫時,ffmpeg最新版本是3.3,但我們還是一如既然的使用2.5.6.二、編譯f

開始學習比特幣開發十一-建立錢包

比特幣使用者最關心除了交易之外就是地址、錢包、私鑰了,交易、地址、錢包、私鑰這些不同概念之間具有內在的聯絡,要了解交易必須先要了解地址、錢包、私鑰這幾個概念,從本章開始,我們開始學習這一部分內容。 建立錢包整體流程 前面我們提到 RPC 的概念,RPC 是 re

開始的Hadoop大資料叢集搭建,全免費VirtualBox虛擬機器Ubuntu版,學習向,超詳細---

     在公司工作了一段時間了,大資料平臺都是公司的運維人員搭建維護的,自己也想親自搭建一套,純粹為了學習和提高自己,也為了以後自己研究用。公司的環境不太適合亂來,自己的就可以隨意玩了。     寫這個也是為了記錄自己學習的過程,同時給大家提供一個參考,想要學習大資料的也

轉載:高德地圖API學習 開始學高德JS API地圖展現

摘要:關於地圖的顯示,我想大家最關心的就是麻點圖,自定義底圖的解決方案了吧。在過去,marker大於500之後,瀏覽器開始逐漸卡死,大家都開始尋找解決方案,比如聚合marker啊,比如麻點圖啊。聚合marker裡面還有一些複雜的演算法,而麻點圖,最讓大家頭疼的,就是如何生成麻點圖,如何切圖,如何把圖片貼到地圖

開始理解JAVA事件處理機制2

extend nds 接下來 htm ref param 簡單 tostring ansi 第一節中的示例過於簡單《從零開始理解JAVA事件處理機制(1)》,簡單到讓大家覺得這樣的代碼簡直毫無用處。但是沒辦法,我們要繼續寫這毫無用處的代碼,然後引出下一階段真正有益的代碼。

webpack開始構建多頁項目mpa

www .html log targe 環境 分開 webpack 支持 博客 歷時一個星期左右,自己參考webpack官網等,從零開始構建webpack項目。本次的博客也是對前面的webpack項目搭建一文的補充。 在本wepack搭建的項目中,自己實現了下面的這些功

開始搭建框架SSM+Redis+MysqlMAVEN項目搭建

blog 目的 定位 enc style log onf project 集成 從零開始搭建框架SSM+Redis+Mysql(二)之MAVEN項目搭建 廢話不說,直接擼步驟!!! 1.創建主項目:ncc-parent 選擇maven創建項目,註意在創建項目中,packi