解密FFmpeg播放trackmode控制-創(chuàng)新互聯(lián)

上一篇文章我們解決了在FFmpeg下如何處理H264和AAC的擴(kuò)展數(shù)據(jù),根據(jù)解出的NALU長(zhǎng)度恢復(fù)了H264的起始碼和AAC的ADTS頭,這樣一般來(lái)說(shuō)播放是沒(méi)有問(wèn)題。本篇文章來(lái)談?wù)勅绾螌?shí)現(xiàn)基于FFmpeg的track mode控制,也就是如何用FFmpeg提供的功能來(lái)實(shí)現(xiàn)基本的seek、快進(jìn)、快退。好了,廢話少了,下面開始基于FFmpeg的track mode之旅。

安吉網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,安吉網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為安吉上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的安吉做網(wǎng)站的公司定做!

FFmpeg提供了一個(gè)seek函數(shù),原型如下:

int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp,                   int flags);

參數(shù)說(shuō)明:

s:操作上下文;

stream_index:基本流索引,表示當(dāng)前的seek是針對(duì)哪個(gè)基本流,比如視頻或者音頻等等。

timestamp:要seek的時(shí)間點(diǎn),以time_base或者AV_TIME_BASE為單位。

Flags:seek標(biāo)志,可以設(shè)置為按字節(jié),在按時(shí)間seek時(shí)取該點(diǎn)之前還是之后的關(guān)鍵幀,以及不按關(guān)鍵幀seek等,詳細(xì)請(qǐng)參考FFmpeg的avformat.h說(shuō)明。基于FFmpeg的所有track mode幾乎都是用這個(gè)函數(shù)來(lái)直接或間接實(shí)現(xiàn)的。

  • 文件的seek功能實(shí)現(xiàn)

要轉(zhuǎn)跳到視頻100秒(100 000毫秒)處的第一個(gè)I幀(如果沒(méi)有則向前找第一個(gè)):

av_seek_frame(pFormatCtx, vid_index, 100000*vid_time_scale/time_base, AVSEEK_FLAG_BACKWARD);

跳到音頻80秒(80 000毫秒)處的幀(采樣):

av_seek_frame(pFormatCtx, aud_index, 80000*aud_time_scale/ time_base, AVSEEK_FLAG_BACKWARD);

跳到文件開始的地方開始播放:

av_seek_frame(pFormatCtx, vid_index, 0, AVSEEK_FLAG_BACKWARD);

上面的time_scale、time_base都能通過(guò)流信息獲取到,請(qǐng)參考前面的文章。有的文件不一定能seek成功,可以考慮在失敗的情況下將AVSEEK_FLAG_BACKWARD改為AVSEEK_FLAG_ANY再次seek,不過(guò)seek到的視頻幀可能不是I幀。

這個(gè)函數(shù)不管你當(dāng)前在什么時(shí)間點(diǎn)上,都可以seek到任何合理位置。比如要實(shí)現(xiàn)在當(dāng)前的基礎(chǔ)上向后或向前跳轉(zhuǎn)10秒,我們可以在av_read_frame函數(shù)拿到的包中含有當(dāng)前時(shí)間戳的基礎(chǔ)上增加或較少一個(gè)10000(換算成播放時(shí)間單位)再seek即可。所以這個(gè)函數(shù)可以用做進(jìn)度的拖放、前進(jìn)/后退一定時(shí)間、循環(huán)播放等功能。

  1. 快進(jìn)快退

對(duì)于快進(jìn)來(lái)說(shuō),一般×××能實(shí)現(xiàn)2倍甚至再高倍速的播放,這種情況直接按照上一篇文章的基本播放流程就可以了。但對(duì)于4倍、8倍、16倍、32倍等高速播放,一般不能像傳統(tǒng)播放那樣一幀一幀的送數(shù)據(jù),不只是解碼能力問(wèn)題,數(shù)據(jù)讀取也可能因?yàn)閹挷粔蚋簧?,我們只能提取其中的I幀進(jìn)行播放,將B幀和P幀丟掉。下面我們就來(lái)討論這個(gè)過(guò)程的實(shí)現(xiàn)流程。

快進(jìn)時(shí),通過(guò)當(dāng)前數(shù)據(jù)包獲得當(dāng)前的時(shí)間PTS,將該P(yáng)TS換算成時(shí)間再加上一小段時(shí)間,作為seek時(shí)間點(diǎn)向后找關(guān)鍵幀,此時(shí)flags可設(shè)置為AVSEEK_FLAG_FRAME。之后用av_read_frame獲取到該關(guān)鍵幀。完成該幀解碼顯示后,再在該幀的PTS時(shí)間上增加一小段時(shí)間后seek,這樣一直重復(fù)上述過(guò)程,流程如下圖:

                  解密FFmpeg播放track mode控制

快退時(shí),通過(guò)當(dāng)前數(shù)據(jù)包獲得當(dāng)前的時(shí)間PTS,將該P(yáng)TS換算成時(shí)間再減去一小段時(shí)間,作為seek時(shí)間點(diǎn)向前找關(guān)鍵幀,此時(shí)flags可設(shè)置為AVSEEK_FLAG_BACKWARD。之后用av_read_frame獲取到該關(guān)鍵幀。完成該幀解碼顯示后,再在該幀的PTS時(shí)間上減去一小段時(shí)間后seek,這樣一直重復(fù)上述結(jié)果,過(guò)程如下圖:

解密FFmpeg播放track mode控制

這樣,我們通過(guò)以上對(duì)av_seek_frame函數(shù)的運(yùn)用,即可完成文件playback的各種track mode實(shí)現(xiàn),其實(shí)理解了這個(gè)函數(shù)后,你還會(huì)有很多其他辦法來(lái)實(shí)現(xiàn),這里只是提供了一種簡(jiǎn)單且占內(nèi)存少的辦法。在特定的情況下還可以先全部走一遍所有幀,并記錄下全部的I幀的時(shí)間戳、幀編號(hào)、位置信息等需要的信息,然后直接從該表里面獲取信息后進(jìn)行seek和讀取這些關(guān)鍵幀進(jìn)行快速播放。

想第一時(shí)間獲得更多原創(chuàng)文章,請(qǐng)關(guān)注個(gè)人微信公眾平臺(tái):程序員互動(dòng)聯(lián)盟(coder_online),掃一掃下方二維碼或者搜索微信號(hào)coder_online即可關(guān)注,里面有大量Android,Chromium,Linux,編程技巧等相關(guān)文章等著您,我們還可以在線交流。

解密FFmpeg播放track mode控制

如需轉(zhuǎn)載本文,請(qǐng)注明出處。

謝謝合作!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站題目:解密FFmpeg播放trackmode控制-創(chuàng)新互聯(lián)
文章來(lái)源:http://bm7419.com/article8/dseoip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、網(wǎng)站維護(hù)、外貿(mào)網(wǎng)站建設(shè)、域名注冊(cè)關(guān)鍵詞優(yōu)化、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名