音視頻專(zhuān)題lsn02-ffmepg入門(mén)02_第1頁(yè)
音視頻專(zhuān)題lsn02-ffmepg入門(mén)02_第2頁(yè)
音視頻專(zhuān)題lsn02-ffmepg入門(mén)02_第3頁(yè)
音視頻專(zhuān)題lsn02-ffmepg入門(mén)02_第4頁(yè)
音視頻專(zhuān)題lsn02-ffmepg入門(mén)02_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、本課講師:Darren老師C/C+音視頻高級(jí)開(kāi)發(fā)FFMPEG入門(mén)課程主講Darren老師:2167195649講師介紹 動(dòng)腦學(xué)院 -Darren老師高級(jí)資深工程師 音視頻開(kāi)發(fā),嵌入式系統(tǒng)開(kāi)發(fā),圖像處理以及服務(wù)器開(kāi)發(fā)等方面有豐富的研發(fā)與實(shí)戰(zhàn)經(jīng)驗(yàn)。 曾供職于珠海揚(yáng)智,深圳聯(lián)發(fā)科等知名半導(dǎo)體公司。 課程提綱常見(jiàn)音視頻概念FFMPEG入門(mén)基于FFMPEG簡(jiǎn)單播放器講解播放器框架播放器框架常用音視頻術(shù)語(yǔ)容器文件(Conainer/File):即特定格式的多媒體文件,比如mp4、flv、mkv等。媒體流(Stream):表示時(shí)間軸上的一段連續(xù)數(shù)據(jù),如一段聲音數(shù)據(jù)、一段視頻數(shù)據(jù)或一段字幕數(shù)據(jù),可以是壓縮的,

2、也可以是非壓縮的,壓縮的數(shù)據(jù)需要關(guān)聯(lián)特定的編解碼器。數(shù)據(jù)幀數(shù)據(jù)包(Frame/Packet):通常,一個(gè)媒體流是由大量的數(shù)據(jù)幀組成的,對(duì)于壓縮數(shù)據(jù),幀對(duì)應(yīng)著編解碼器的最小處理單元,分屬于不同媒體流的數(shù)據(jù)幀交錯(cuò)存儲(chǔ)于容器之中。編解碼器:編解碼器是以幀為單位實(shí)現(xiàn)壓縮數(shù)據(jù)和原始數(shù)據(jù)之間的相互轉(zhuǎn)換的。視頻音頻MP4DeMuxerMuxer常用概念-復(fù)用器復(fù)用器,比如MP4/FLV 解復(fù)用器,MP4/FLV 常用概念-編解碼器視頻編解碼器 音頻編解碼器FFmpeg庫(kù)簡(jiǎn)介 FFMPEG的整體結(jié)構(gòu)ijkplayerFFmpeg庫(kù)簡(jiǎn)介 FFMPEG有8個(gè)常用庫(kù):AVUtil:核心工具庫(kù),下面的許多其他模塊都會(huì)

3、依賴(lài)該庫(kù)做一些基本的音視頻處理操作。AVFormat:文件格式和協(xié)議庫(kù),該模塊是最重要的模塊之一,封裝了Protocol層和Demuxer、Muxer層,使得協(xié)議和格式對(duì)于開(kāi)發(fā)者來(lái)說(shuō)是透明的。 AVCodec:編解碼庫(kù),封裝了Codec層,但是有一些Codec是具備自己的License的,F(xiàn)Fmpeg是不會(huì)默認(rèn)添加像libx264、FDK-AAC等庫(kù)的,但是FFmpeg就像一個(gè)平臺(tái)一樣,可以將其他的第三方的Codec以插件的方式添加進(jìn)來(lái),然后為開(kāi)發(fā)者提供統(tǒng)一的接口。AVFilter:音視頻濾鏡庫(kù),該模塊提供了包括音頻特效和視頻特效的處理,在使用FFmpeg的API進(jìn)行編解碼的過(guò)程中,直接使用該

4、模塊為音視頻數(shù)據(jù)做特效處理是非常方便同時(shí)也非常高效的一種方式。FFmpeg庫(kù)簡(jiǎn)介 AVDevice:輸入輸出設(shè)備庫(kù),比如,需要編譯出播放聲音或者視頻的工具ffplay,就需要確保該模塊是打開(kāi)的,同時(shí)也需要SDL的預(yù)先編譯,因?yàn)樵撛O(shè)備模塊播放聲音與播放視頻使用的都是SDL庫(kù)。SwrRessample:該模塊可用于音頻重采樣,可以對(duì)數(shù)字音頻進(jìn)行聲道數(shù)、數(shù)據(jù)格式、采樣率等多種基本信息的轉(zhuǎn)換。SWScale:該模塊是將圖像進(jìn)行格式轉(zhuǎn)換的模塊,比如,可以將YUV的數(shù)據(jù)轉(zhuǎn)換為RGB的數(shù)據(jù),縮放尺寸由1280*720變?yōu)?00*480。PostProc:該模塊可用于進(jìn)行后期處理,當(dāng)我們使用AVFilter的

5、時(shí)候需要打開(kāi)該模塊的開(kāi)關(guān),因?yàn)镕ilter中會(huì)使用到該模塊的一些基礎(chǔ)函數(shù)。FFmpeg函數(shù)簡(jiǎn)介 av_register_all():注冊(cè)所有組件,4.0已經(jīng)棄用avdevice_register_all()對(duì)設(shè)備進(jìn)行注冊(cè),比如V4L2等。avformat_network_init();初始化網(wǎng)絡(luò)庫(kù)以及網(wǎng)絡(luò)加密協(xié)議相關(guān)的庫(kù)(比如openssl)FFmpeg函數(shù)簡(jiǎn)介 avformat_alloc_context();負(fù)責(zé)申請(qǐng)一個(gè)AVFormatContext結(jié)構(gòu)的內(nèi)存,并進(jìn)行簡(jiǎn)單初始化avformat_free_context();釋放該結(jié)構(gòu)里的所有東西以及該結(jié)構(gòu)本身avformat_close_

6、input();關(guān)閉解復(fù)用器。關(guān)閉后就不再需要使用avformat_free_context 進(jìn)行釋放。avformat_open_input();打開(kāi)輸入視頻文件avformat_find_stream_info():獲取視頻文件信息av_read_frame(); 讀取音視頻包avformat_seek_file(); 定位文件av_seek_frame():定位文件封裝格式相關(guān)FFmpeg函數(shù)簡(jiǎn)介 封裝格式相關(guān)FFmpeg解碼函數(shù)簡(jiǎn)介 avcodec_alloc_context3():分配解碼器上下文avcodec_find_decoder():根據(jù)ID查找解碼器avcodec_find

7、_decoder_by_name():根據(jù)解碼器名字avcodec_open2():打開(kāi)編解碼器avcodec_decode_video2():解碼一幀視頻數(shù)據(jù)avcodec_decode_audio4():解碼一幀音頻數(shù)據(jù)avcodec_send_packet():發(fā)送編碼數(shù)據(jù)包avcodec_receive_frame():接收解碼后數(shù)據(jù)avcodec_free_context():釋放解碼器上下文,包含了avcodec_close()avcodec_close():關(guān)閉解碼器解碼器相關(guān)FFmpeg解碼函數(shù)簡(jiǎn)介 解碼器相關(guān)Ffmpeg 3.3 組件注冊(cè)方式我們使用ffmpeg,首先要執(zhí)行a

8、v_register_all,把全局的解碼器、編碼器等結(jié)構(gòu)體注冊(cè)到各自全局的對(duì)象鏈表里,以便后面查找調(diào)用。Ffmpeg 4.0.2 組件注冊(cè)方式FFMPEG內(nèi)部去做,不需要用戶(hù)調(diào)用API去注冊(cè)。以codec編解碼器為例:在configure的時(shí)候生成要注冊(cè)的組件 ponents libavcodec/codec_list.c AVCodec codec_list $CODEC_LIST 這里會(huì)生成一個(gè)codec_list.c 文件,里面只有static const AVCodec * const codec_list數(shù)組。2. 在libavcodec/allcodecs.c將static co

9、nst AVCodec * const codec_list的編解碼器用鏈表的方式組織起來(lái)。Ffmpeg 4.0.2 組件注冊(cè)方式FFMPEG內(nèi)部去做,不需要用戶(hù)調(diào)用API去注冊(cè)。對(duì)于demuxer/muxer(解復(fù)用器,也稱(chēng)容器)則對(duì)應(yīng)1. libavformat/muxer_list.clibavformat/demuxer_list.c 這兩個(gè)文件也是在configure的時(shí)候生成,也就是說(shuō)直接下載源碼是沒(méi)有這兩個(gè)文件的。2. 在libavformat/allformats.c將demuxer_list和muexr_list以鏈表的方式組織。其他組件也是類(lèi)似的方式。FFmpeg數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)

10、介 AVFormatContext 封裝格式上下文結(jié)構(gòu)體,也是統(tǒng)領(lǐng)全局的結(jié)構(gòu)體,保存了視頻文件封裝格式相關(guān)信息。 AVInputFormat demuxer 每種封裝格式(例如FLV, MKV, MP4, AVI)對(duì)應(yīng)一個(gè)該結(jié)構(gòu)體。 AVOutputFormat muxer AVStream 視頻文件中每個(gè)視頻(音頻)流對(duì)應(yīng)一個(gè)該結(jié)構(gòu)體。 AVCodecContext 編解碼器上下文結(jié)構(gòu)體,保存了視頻(音頻)編解碼相關(guān)信息。 AVCodec 每種視頻(音頻)編解碼器(例如H.264解碼器)對(duì)應(yīng)一個(gè)該結(jié)構(gòu)體。 AVPacket 存儲(chǔ)一幀壓縮編碼數(shù)據(jù)。 AVFrame 存儲(chǔ)一幀解碼后像素(采樣)數(shù)

11、據(jù)。 結(jié)構(gòu)體名帶context意味著什么?Ffmpeg數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系A(chǔ)VFormatContext和AVInputFormat之間的關(guān)系A(chǔ)VFormatContext API調(diào)用AVInputFormat 主要是FFMPEG內(nèi)部調(diào)用面向?qū)ο蟮姆庋b?int avformat_open_input(AVFormatContext *ps, const char *filename,AVInputFormat *fmt, AVDictionary *options)所有的方法可重入的Ffmpeg數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系A(chǔ)VCodecContext和AVCodec之間的關(guān)系Ffmpeg數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系

12、AVFormatContext, AVStream和AVCodecContext之間的關(guān)系Ffmpeg數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系區(qū)分不同的碼流 AVMEDIA_TYPE_VIDEO視頻流video_index = av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO, -1,-1, NULL, 0) AVMEDIA_TYPE_AUDIO音頻流audio_index = av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO, -1,-1, NULL, 0)Ffmpeg數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系A(chǔ)VPacket和AVFrame之間的關(guān)系FFmpeg數(shù)

13、據(jù)結(jié)構(gòu)分析 AVFormatContextiformat:輸入媒體的AVInputFormat,比如指向AVInputFormat ff_flv_demuxernb_streams:輸入媒體的AVStream 個(gè)數(shù)streams:輸入媒體的AVStream 數(shù)組duration:輸入媒體的時(shí)長(zhǎng)(以微秒為單位),計(jì)算方式可以參考av_dump_format()函數(shù)。bit_rate:輸入媒體的碼率 AVInputFormatname:封裝格式名稱(chēng)extensions:封裝格式的擴(kuò)展名id:封裝格式ID一些封裝格式處理的接口函數(shù),比如read_packet()FFmpeg數(shù)據(jù)結(jié)構(gòu)分析 AVStre

14、amindex:標(biāo)識(shí)該視頻/音頻流time_base:該流的時(shí)基,PTS*time_base=真正的時(shí)間(秒)avg_frame_rate: 該流的幀率duration:該視頻/音頻流長(zhǎng)度codecpar:編解碼器參數(shù)屬性 AVCodecParameterscodec_type:媒體類(lèi)型AVMEDIA_TYPE_VIDEO/ AVMEDIA_TYPE_AUDIO等codec_id:編解碼器類(lèi)型, AV_CODEC_ID_H264/ AV_CODEC_ID_AAC等。FFmpeg數(shù)據(jù)結(jié)構(gòu)分析 AVCodecContextcodec:編解碼器的AVCodec,比如指向AVCodec ff_aac_

15、latm_decoderwidth, height:圖像的寬高(只針對(duì)視頻)pix_fmt:像素格式(只針對(duì)視頻)sample_rate:采樣率(只針對(duì)音頻)channels:聲道數(shù)(只針對(duì)音頻)sample_fmt:采樣格式(只針對(duì)音頻) AVCodecname:編解碼器名稱(chēng)type:編解碼器類(lèi)型id:編解碼器ID一些編解碼的接口函數(shù),比如int (*decode)()FFmpeg數(shù)據(jù)結(jié)構(gòu)分析 AVPacketpts:顯示時(shí)間戳dts:解碼時(shí)間戳data:壓縮編碼數(shù)據(jù)size:壓縮編碼數(shù)據(jù)大小pos:數(shù)據(jù)的偏移地址stream_index:所屬的AVStream AVFramedata:解碼

16、后的圖像像素?cái)?shù)據(jù)(音頻采樣數(shù)據(jù))linesize:對(duì)視頻來(lái)說(shuō)是圖像中一行像素的大?。粚?duì)音頻來(lái)說(shuō)是整個(gè)音頻幀的大小width, height:圖像的寬高(只針對(duì)視頻)key_frame:是否為關(guān)鍵幀(只針對(duì)視頻) 。pict_type:幀類(lèi)型(只針對(duì)視頻) 。例如I, P, B sample_rate:音頻采樣率(只針對(duì)音頻)nb_samples:音頻每通道采樣數(shù)(只針對(duì)音頻)pts:顯示時(shí)間戳SDL簡(jiǎn)介作用SDL(Simple DirectMedia Layer)庫(kù)的作用主要是封裝了復(fù)雜的視音頻底層交互工作, 簡(jiǎn)化了視音頻處理的難度。本次課程我們重點(diǎn)不在SDL,只因?yàn)樯婕暗揭恍┖瘮?shù)的調(diào)用,所以

17、稍微做一個(gè)簡(jiǎn)介SDL簡(jiǎn)介 SDL結(jié)構(gòu)如下所示??梢钥闯鏊鼘?shí)際上還是調(diào)用了DirectX等底層的API完成了和硬件的交互 SDL視頻顯示函數(shù)簡(jiǎn)介 SDL視頻顯示函數(shù)簡(jiǎn)介SDL_Init():初始化SDL系統(tǒng)SDL_CreateWindow():創(chuàng)建窗口SDL_WindowSDL_CreateRenderer():創(chuàng)建渲染器SDL_RendererSDL_CreateTexture():創(chuàng)建紋理SDL_TextureSDL_UpdateTexture():設(shè)置紋理的數(shù)據(jù)SDL_RenderCopy():將紋理的數(shù)據(jù)拷貝給渲染器SDL_RenderPresent():顯示SDL_Delay():工具函數(shù),用于延時(shí)。SDL_Quit():退出SDL系統(tǒng) SDL中事件和多線(xiàn)程 SDL多線(xiàn)程函數(shù)SDL_CreateThread():創(chuàng)建一個(gè)線(xiàn)程SDL_LockMutex(), SDL_UnlockMutex():互斥量

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論