国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

這篇具有很好參考價值的文章主要介紹了音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

播放器框架

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

常用音視頻術語

? 容器/文件(Conainer/File):即特定格式的多媒體文件,
比如mp4、flv、mkv等。

? 媒體流(Stream):表示時間軸上的一段連續(xù)數(shù)據(jù),如一
段聲音數(shù)據(jù)、一段視頻數(shù)據(jù)或一段字幕數(shù)據(jù),可以是壓縮
的,也可以是非壓縮的,壓縮的數(shù)據(jù)需要關聯(lián)特定的編解
碼器(有些碼流音頻他是純PCM)。

? 數(shù)據(jù)幀/數(shù)據(jù)包(Frame/Packet):通常,一個媒體流是
由大量的數(shù)據(jù)幀組成的,對于壓縮數(shù)據(jù),幀對應著編解碼
器的最小處理單元,分屬于不同媒體流的數(shù)據(jù)幀交錯存儲
于容器之中。

? 編解碼器:編解碼器是以幀為單位實現(xiàn)壓縮數(shù)據(jù)和原始數(shù)
據(jù)之間的相互轉(zhuǎn)換的。

常用概念-復用器

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

常用概念-編解碼器

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

FFmpeg的整體結(jié)構(gòu)

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

FFMPEG有8個常用庫

? AVUtil:核心工具庫,下面的許多其他模塊都會依賴該庫做一些基本的音視頻處理操作。

? AVFormat:文件格式和協(xié)議庫,該模塊是最重要的模塊之一,封裝了Protocol層和Demuxer、Muxer層,使得協(xié)議和格式對于開發(fā)者來說是透明的。

? AVCodec:編解碼庫,封裝了Codec層,但是有一些Codec是具備自己的License的,F(xiàn)Fmpeg是不會默認添加像libx264、FDK-AAC等庫的,但是FFmpeg就像一個平臺一樣,可以將其他的第三方的Codec以插件的方式添加進來,然后為開發(fā)者提供統(tǒng)一的接口。

? AVFilter:音視頻濾鏡庫,該模塊提供了包括音頻特效和視頻特效的處理,在使用FFmpeg的API進行編解碼的過程中,直接使用該模塊為音視頻數(shù)據(jù)做特效處理是非常方便同時也非常高效的一種方式。

? AVDevice:輸入輸出設備庫,比如,需要編譯出播放聲音或者視頻的工具ffplay,就需要確保該模塊是打開的,同時也需要SDL的預先編譯,因為該設備模塊播放聲音與播放視頻使用的都是SDL庫。

? SwrRessample:該模塊可用于音頻重采樣,可以對數(shù)字音頻進行聲道數(shù)、數(shù)據(jù)格式、采樣率等多種基本信息的轉(zhuǎn)換。

? SWScale:該模塊是將圖像進行格式轉(zhuǎn)換的模塊,比如,可以將YUV的數(shù)據(jù)轉(zhuǎn)換為RGB的數(shù)據(jù),縮放尺寸由1280720變?yōu)?00480。

? PostProc:該模塊可用于進行后期處理,當我們使用AVFilter的時候需要打開該模塊的開關,因為Filter中會使用到該模塊的一些基礎函數(shù)。

FFmpeg函數(shù)簡介

? av_register_all():注冊所有組件,4.0已經(jīng)棄用

? avdevice_register_all()對設備進行注冊,比如V4L2等。

? avformat_network_init();初始化網(wǎng)絡庫以及網(wǎng)絡加密協(xié)議相關的庫(比如openssl)

FFmpeg函數(shù)簡介-封裝格式相關

? avformat_alloc_context();負責申請一個AVFormatContext結(jié)構(gòu)的內(nèi)存,并進行簡單初始化

? avformat_free_context();釋放該結(jié)構(gòu)里的所有東西以及該結(jié)構(gòu)本身

? avformat_close_input();關閉解復用器。關閉后就不再需要使用avformat_free_context 進行釋放。

? avformat_open_input();打開輸入視頻文件

? avformat_find_stream_info():獲取音視頻文件信息

? av_read_frame(); 讀取音視頻包

? avformat_seek_file(); 定位文件

? av_seek_frame():定位文件

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

FFmpeg解碼函數(shù)簡介-解碼器相關

? avcodec_alloc_context3(): 分配解碼器上下文

? avcodec_find_decoder():根據(jù)ID查找解碼器

? avcodec_find_decoder_by_name():根據(jù)解碼器名字

? avcodec_open2(): 打開編解碼器

? 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():關閉解碼器

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

FFmpeg 3.x 組件注冊方式

我們使用ffmpeg,首先要執(zhí)行av_register_all,把全局的解碼器、編碼器等結(jié)構(gòu)體注冊到各自全局的對象鏈表里,以便后面查找調(diào)用。

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

FFmpeg 4.x 組件注冊方式

FFmpeg內(nèi)部去做,不需要用戶調(diào)用API去注冊。
以codec編解碼器為例:

  1. 在configure的時候生成要注冊的組件./configure:7203:print_enabled_components libavcodec/codec_list.c AVCodec codec_list $CODEC_LIST這里會生成一個codec_list.c 文件,里面只有static const AVCodec *
    const codec_list[]數(shù)組。

  2. 在libavcodec/allcodecs.c將static const AVCodec * const codec_list[]的編解碼器用鏈表的方式組織起來。

Ffmpeg 4.0.2 組件注冊方式

FFmepg內(nèi)部去做,不需要用戶調(diào)用API去注冊。

對于demuxer/muxer(解復用器,也稱容器)則對應

  1. libavformat/muxer_list.c libavformat/demuxer_list.c 這兩個文件也是在configure的時候生成,也就是說直接下載源碼是沒有這兩個文件的。

  2. 在libavformat/allformats.c將demuxer_list[]和muexr_list[]以鏈表的方式組織。

其他組件也是類似的方式

FFmpeg數(shù)據(jù)結(jié)構(gòu)簡介

AVFormatContext
封裝格式上下文結(jié)構(gòu)體,也是統(tǒng)領全局的結(jié)構(gòu)體,保存了視頻文件封裝格式相關信息。

AVInputFormat demuxer
每種封裝格式(例如FLV, MKV, MP4, AVI)對應一個該結(jié)構(gòu)體。

AVOutputFormat muxer

AVStream
視頻文件中每個視頻(音頻)流對應一個該結(jié)構(gòu)體。

AVCodecContext
編解碼器上下文結(jié)構(gòu)體,保存了視頻(音頻)編解碼相關信息。

AVCodec
每種視頻(音頻)編解碼器(例如H.264解碼器)對應一個該結(jié)構(gòu)體。

AVPacket
存儲一幀壓縮編碼數(shù)據(jù)。

AVFrame
存儲一幀解碼后像素(采樣)數(shù)據(jù)。

如果上下文數(shù)據(jù)保存在解碼器里面?
多路解碼的時候數(shù)據(jù)肯定有沖突。

FFmpeg數(shù)據(jù)結(jié)構(gòu)之間的關系

AVFormatContext和AVInputFormat之間的關系

AVFormatContext API調(diào)用
AVInputFormat 主要是FFMPEG內(nèi)部調(diào)用

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

AVCodecContext和AVCodec之間的關系

AVCodecContext 編碼器上下文結(jié)構(gòu)體
struct AVCodec *codec;

AVCodec 每種視頻(音頻)編解碼器
int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr);

AVFormatContext, AVStream和AVCodecContext之間的關系

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

區(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)

AVPacket 里面也有一個index的字段

FFmpeg數(shù)據(jù)結(jié)構(gòu)分析

? AVFormatContext

? iformat:輸入媒體的AVInputFormat,比如指向AVInputFormat
ff_flv_demuxer

? nb_streams:輸入媒體的AVStream 個數(shù)

? streams:輸入媒體的AVStream []數(shù)組

? duration:輸入媒體的時長(以微秒為單位),計算方式可以參
考av_dump_format()函數(shù)。

? bit_rate:輸入媒體的碼率

? AVInputFormat

? name:封裝格式名稱

? extensions:封裝格式的擴展名

? id:封裝格式ID

? 一些封裝格式處理的接口函數(shù),比如read_packet()

? AVStream

? index:標識該視頻/音頻流

? time_base:該流的時基,PTS*time_base=真正的時間(秒)

? avg_frame_rate: 該流的幀率

? duration:該視頻/音頻流長度

? codecpar:編解碼器參數(shù)屬性

? AVCodecParameters

? codec_type:媒體類型,比如AVMEDIA_TYPE_VIDEO
AVMEDIA_TYPE_AUDIO等

? codec_id:編解碼器類型, 比如AV_CODEC_ID_H264
AV_CODEC_ID_AAC等。

? AVCodecContext

? codec:編解碼器的AVCodec,比如指向AVCodec
ff_aac_latm_decoder

? width, height:圖像的寬高(只針對視頻)

? pix_fmt:像素格式(只針對視頻)

? sample_rate:采樣率(只針對音頻)

? channels:聲道數(shù)(只針對音頻)

? sample_fmt:采樣格式(只針對音頻)

? AVCodec

? name:編解碼器名稱

? type:編解碼器類型

? id:編解碼器ID

? 一些編解碼的接口函數(shù),比如int (*decode)()

? AVCodecContext

? codec:編解碼器的AVCodec,比如指向AVCodec
ff_aac_latm_decoder

? width, height:圖像的寬高(只針對視頻)

? pix_fmt:像素格式(只針對視頻)

? sample_rate:采樣率(只針對音頻)

? channels:聲道數(shù)(只針對音頻)

? sample_fmt:采樣格式(只針對音頻)

? AVCodec

? name:編解碼器名稱

? type:編解碼器類型

? id:編解碼器ID

? 一些編解碼的接口函數(shù),比如int (*decode)()

AVPacket

? pts:顯示時間戳

? dts:解碼時間戳

? data:壓縮編碼數(shù)據(jù)

? size:壓縮編碼數(shù)據(jù)大小

? pos:數(shù)據(jù)的偏移地址

? stream_index:所屬的AVStream

AVFrame

? data:解碼后的圖像像素數(shù)據(jù)(音頻采樣數(shù)據(jù))

? linesize:對視頻來說是圖像中一行像素的大小;對音頻來說是整個音頻幀的大小

? width, height:圖像的寬高(只針對視頻)

? key_frame:是否為關鍵幀(只針對視頻) 。

? pict_type:幀類型(只針對視頻) 。例如I, P, B

? sample_rate:音頻采樣率(只針對音頻)

? nb_samples:音頻每通道采樣數(shù)(只針對音頻)

? pts:顯示時間

FFmpeg內(nèi)存模型

? 從現(xiàn)有的Packet拷貝一個新Packet的時候,有兩種情況:

? ①兩個Packet的buf引用的是同一數(shù)據(jù)緩存空間,這時
候要注意數(shù)據(jù)緩存空間的釋放問題;

? ②兩個Packet的buf引用不同的數(shù)據(jù)緩存空間,每個
Packet都有數(shù)據(jù)緩存空間的copy;

音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型
音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型
音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型

? 對于多個AVPacket共享同一個緩存空間,F(xiàn)Fmpeg使用的引用計數(shù)的機制(reference-count):

?? 初始化引用計數(shù)為0,只有真正分配AVBuffer的時候,引用計數(shù)初始化為1;

?? 當有新的Packet引用共享的緩存空間時,就將引用計數(shù)+1;

?? 當釋放了引用共享空間的Packet,就將引用計數(shù)-1;引用計數(shù)為0時,就釋放掉引用的緩存空間AVBuffer。

? AVFrame也是采用同樣的機制。

AVPacket常用API

AVPacket *av_packet_alloc(void); 分配AVPacket
這個時候和buffer沒有關系

void av_packet_free(AVPacket **pkt); 釋放AVPacket
和_alloc對應

void av_init_packet(AVPacket *pkt); 初始化AVPacket
只是單純初始化pkt字段

int av_new_packet(AVPacket *pkt, int size); 給AVPacket的buf分配內(nèi)存,引用計數(shù)初始化為1

int av_packet_ref(AVPacket *dst, const AVPacket *src); 增加引用計數(shù)

void av_packet_unref(AVPacket *pkt); 減少引用計數(shù)

void av_packet_move_ref(AVPacket *dst, AVPacket *src); 轉(zhuǎn)移引用計數(shù)

AVPacket *av_packet_clone(const AVPacket *src); 等于av_packet_alloc()+av_packet_ref()

AVFrame *av_frame_alloc(void); 分配AVFrame

void av_frame_free(AVFrame **frame); 釋放AVFrame

int av_frame_ref(AVFrame *dst, const AVFrame *src); 增加引用計數(shù)

void av_frame_unref(AVFrame *frame); 減少引用計數(shù)

void av_frame_move_ref(AVFrame *dst, AVFrame *src); 轉(zhuǎn)移引用計數(shù)

int av_frame_get_buffer(AVFrame *frame, int align); 根據(jù)AVFrame分配內(nèi)存

AVFrame *av_frame_clone(const AVFrame *src); 等于av_frame_alloc()+av_frame_ref()文章來源地址http://www.zghlxwxcb.cn/news/detail-426788.html

到了這里,關于音視頻八股文(6)-- ffmpeg大體介紹和內(nèi)存模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 音視頻八股文(10)-- mp4結(jié)構(gòu)

    音視頻八股文(10)-- mp4結(jié)構(gòu)

    mp4?件格式?被稱為MPEG-4 Part 14,出?MPEG-4標準第14部分 。它是?種多媒體格式容器,?泛?于包裝視頻和?頻數(shù)據(jù)流、海報、字幕和元數(shù)據(jù)等。(順便?提,?前流?的視頻編碼格式AVC/H264 定義在MPEG-4 Part 10)。 mp4?件由box組成,每個box分為Header和Data。其中Header部分包含了

    2024年02月02日
    瀏覽(34)
  • 音視頻八股文(7)-- 音頻aac adts三層結(jié)構(gòu)

    音視頻八股文(7)-- 音頻aac adts三層結(jié)構(gòu)

    AAC(Advanced Audio Coding)是一種現(xiàn)代的音頻編碼技術,用于數(shù)字音頻的傳輸和存儲領域。AAC是MPEG-2和MPEG-4標準中的一部分,可提供更高質(zhì)量的音頻數(shù)據(jù),并且相比于MP3等舊有音頻格式,AAC需要更少的比特率。 AAC通過使用一些高級的音頻編碼算法來實現(xiàn)更好的聲音質(zhì)量和更低的壓

    2024年02月06日
    瀏覽(21)
  • 什么叫面試八股文,一篇文章帶你入門音視頻(1),使用指南

    什么叫面試八股文,一篇文章帶你入門音視頻(1),使用指南

    版稅方式:按個收取 備注:WMA的全稱是Windows Media Audio,它是微軟公司推出的與MP3格式齊名的一種新的音頻格式。由于WMA在壓縮比和音質(zhì)方面都超過了MP3,更是遠勝于RA(Real Audio),即使在較低的采樣頻率下也能產(chǎn)生較好的音質(zhì),再加上WMA有微軟的Windows Media Player做其強大的后盾

    2024年04月25日
    瀏覽(97)
  • 音視頻八股文(9)-- flv的h264六層結(jié)構(gòu)和aac六層結(jié)構(gòu)

    音視頻八股文(9)-- flv的h264六層結(jié)構(gòu)和aac六層結(jié)構(gòu)

    FLV(Flash Video)是Adobe公司推出的?種流媒體格式,由于其封裝后的?視頻?件體積?、封裝簡單等特點,?常適合于互聯(lián)?上使?。?前主流的視頻?站基本都?持FLV。采?FLV格式封裝的?件后綴為.flv。 FLV封裝格式是由?個?件頭(file header)和 ?件體(file Body)組成。其中,F(xiàn)LV

    2024年02月01日
    瀏覽(28)
  • ffmpeg@音視頻工具@音視頻合并

    FFmpeg中文網(wǎng) (github.net.cn) FFmpeg 是一款強大的開源跨平臺音視頻處理工具集,它包含了一系列命令行工具以及用于音頻和視頻編碼解碼、格式轉(zhuǎn)換、抓取、流化等功能的庫。FFmpeg 支持多種視頻、音頻格式和編解碼器,能夠進行音視頻的壓縮、封裝、轉(zhuǎn)碼、分割、合并、過濾、抓

    2024年03月17日
    瀏覽(29)
  • 音視頻 FFmpeg音視頻處理流程

    音視頻 FFmpeg音視頻處理流程

    推薦一個零聲學院項目課,個人覺得老師講得不錯,分享給大家: 零聲白金學習卡(含基礎架構(gòu)/高性能存儲/golang云原生/音視頻/Linux內(nèi)核) https://xxetb.xet.tech/s/VsFMs

    2024年02月12日
    瀏覽(97)
  • 音視頻 ffmpeg命令提取音視頻數(shù)據(jù)

    保留封裝格式 提取視頻 提取音頻 推薦一個零聲學院項目課,個人覺得老師講得不錯,分享給大家: 零聲白金學習卡(含基礎架構(gòu)/高性能存儲/golang云原生/音視頻/Linux內(nèi)核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    瀏覽(26)
  • 【FFmpeg】音視頻錄制 ① ( 查詢系統(tǒng)中 ffmpeg 可錄制的音視頻輸入設備 | 使用 ffmpeg 命令錄制音視頻數(shù)據(jù) | 錄制視頻數(shù)據(jù)命令 |錄制音頻數(shù)據(jù)| 同時錄制音頻和視頻數(shù)據(jù)命令 )

    【FFmpeg】音視頻錄制 ① ( 查詢系統(tǒng)中 ffmpeg 可錄制的音視頻輸入設備 | 使用 ffmpeg 命令錄制音視頻數(shù)據(jù) | 錄制視頻數(shù)據(jù)命令 |錄制音頻數(shù)據(jù)| 同時錄制音頻和視頻數(shù)據(jù)命令 )

    在 Windows 系統(tǒng)中 , 使用 ffmpeg 命令 錄制 音視頻 , 需要先獲取 系統(tǒng)的 音視頻設備 信息 , 錄制 音視頻 本質(zhì)上是從 系統(tǒng)音視頻設備 中獲取數(shù)據(jù) ; 執(zhí)行 命令 , 可以獲取 系統(tǒng)中 ffmpeg 可用的 DirectShow 音視頻輸入設備 ; 命令參數(shù)解析 : -list_devices true : 列出所有 ffmpeg 的 指定類型的可

    2024年04月25日
    瀏覽(31)
  • 音視頻 ffmpeg視頻裁剪

    將輸入視頻幀的寬度和高度從x和y值表示的位置裁剪到指定的寬度和高度;x和y是輸出的左上角坐標,協(xié)調(diào)系統(tǒng)的中心是輸入視頻幀的左上角。 如果使用了可選的keep_aspect參數(shù),將會改變輸出SAR(樣本寬比)以補償新的DAR(顯示長寬比) 推薦一個零聲學院項目課,個人覺得老師講得不

    2024年02月10日
    瀏覽(24)
  • 音視頻 ffmpeg命令視頻錄制(Windows)

    先安裝dshow軟件 Screen Capturer Recorder, 項目地址:https://sourceforge.net/projects/screencapturer/files/ 然后查看可用設備名字:ffmpeg -list_devices true -f dshow -i dummy 錄制視頻(默認參數(shù)) 錄制聲音(默認參數(shù)) 同時錄制聲音和視頻(默認參數(shù)) 查看視頻錄制的可選參數(shù) 查看視頻錄制的可

    2024年02月10日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包