FFMPEG-資料結構解釋(AVCodecContext,AVStream,AVFormatContext)

來源:互聯網
上載者:User


原文地址:http://blog.csdn.net/yuan892173701/article/details/8702333


AVCodecContext

 這是一個描述轉碼器內容相關的資料結構,包含了眾多轉碼器需要的參數資訊

 如果是單純使用libavcodec,這部分資訊需要調用者進行初始化;如果是使用整個FFMPEG庫,這部分資訊在調用 av_open_input_file和av_find_stream_info的過程中根據檔案的頭資訊及媒體流內的頭部資訊完成初始化。其中幾個主要 域的釋義如下:

  1. extradata/extradata_size: 這個buffer中存放瞭解碼器可能會用到的額外資訊,在av_read_frame中填充。一般來說,首先,某種具體格式的demuxer在讀取格式頭 資訊的時候會填充extradata,其次,如果demuxer沒有做這個事情,比如可能在頭部壓根兒就沒有相關的編解碼資訊,則相應的parser會繼 續從已經解複用出來的媒體流中繼續尋找。在沒有找到任何額外資訊的情況下,這個buffer指標為空白。
  2. time_base:
  3. width/height:視頻的寬和高。
  4. sample_rate/channels:音訊採樣率和通道數目。
  5. sample_fmt: 音訊原始採樣格式。
  6. codec_name/codec_type/codec_id/codec_tag:轉碼器的資訊。

AVStream

 該結構體描述一個媒體流

 主要域的釋義如下,其中大部分域的值可以由av_open_input_file根據檔案頭的資訊確定,缺少的資訊需要通過調用av_find_stream_info讀幀及軟解碼進一步擷取:

  1. index/id:index對應流的索引,這個數字是自動產生的,根據index可以從AVFormatContext::streams表中索引到該流;而id則是流的標識,依賴於具體的容器格式。比如對於MPEG TS格式,id就是pid。
  2. time_base:流的時間基準,是一個實數,該流中媒體資料的pts和dts都將以這個時間基準為粒度。通常,使用av_rescale/av_rescale_q可以實現不同時間基準的轉換。
  3. start_time:流的起始時間,以流的時間基準為單位,通常是該流中第一個幀的pts。
  4. duration:流的總時間,以流的時間基準為單位。
  5. need_parsing:對該流parsing過程的控制域。
  6. nb_frames:流內的幀數目。
  7. r_frame_rate/framerate/avg_frame_rate:幀率相關。
  8. codec:指向該流對應的AVCodecContext結構,調用av_open_input_file時產生。
  9. parser:指向該流對應的AVCodecParserContext結構,調用av_find_stream_info時產生。

AVFormatContext

   這個結構體描述了一個媒體檔案或媒體流的構成和基本資料

 這是FFMpeg中最為基本的一個結構,是其他所有結構的根,是一個多媒體檔案或流的根本抽象。其中:nb_streams和streams所表示的AVStream結構指標數組包含了所有內嵌媒體流的描述;iformat和oformat指向對應的demuxer和muxer指標;pb則指向一個控制底層資料讀寫的ByteIOContext結構。

  •     start_time和duration是從streams數組的各個AVStream中推斷出的多媒體檔案的起始時間和長度,以微妙為單位。

通常,這個結構由av_open_input_file在內部建立並以預設值初始化部分成員。但是,如果調用者希望自己建立該結構,則需要顯式為該結構的一些成員置預設值——如果沒有預設值的話,會導致之後的動作產生異常。以下成員需要被關註:

  •     probesize
  •     mux_rate
  •     packet_size
  •     flags
  •     max_analyze_duration
  •     key
  •     max_index_size
  •     max_picture_buffer
  •     max_delay

 

AVPacket

 AVPacket定義在avcodec.h中

 FFMPEG使用AVPacket來暫存解複用之後、解碼之前的媒體資料(一個音/視訊框架、一個字幕包等)及附加資訊(解碼時間戳記、顯示時間戳記、時間長度等)。其中:

  •     dts 表示解碼時間戳記,pts表示顯示時間戳記,它們的單位是所屬媒體流的時間基準。
  •     stream_index 給出所屬媒體流的索引;
  •     data 為資料緩衝區指標,size為長度;
  •     duration 為資料的時間長度,也是以所屬媒體流的時間基準為單位;
  •     pos 表示該資料在媒體流中的位元組位移量;
  •     destruct 為用於釋放資料緩衝區的函數指標;
  •     flags 為標誌域,其中,最低為置1表示該資料是一個主要畫面格。

 AVPacket 結構本身只是個容器,它使用data成員指向實際的資料緩衝區,這個緩衝區可以通過av_new_packet建立,可以通過     av_dup_packet 拷貝,也可以由FFMPEG的API產生(如av_read_frame),使用之後需要通過調用av_free_packet釋放。            

av_free_packet調用的是結構體本身的destruct函數,它的值有兩種情況:(1)av_destruct_packet_nofree或 0;(2)av_destruct_packet,其中,前者僅僅是將data和size的值清0而已,後者才會真正地釋放緩衝區。FFMPEG內部使用 AVPacket結構建立緩衝區裝載資料,同時提供destruct函數,如果FFMPEG打算自己維護緩衝區,則將destruct設為
av_destruct_packet_nofree,使用者調用av_free_packet清理緩衝區時並不能夠將其釋放;如果FFMPEG不會再使用 該緩衝區,則將destruct設為av_destruct_packet,表示它能夠被釋放。對於緩衝區不能夠被釋放的AVPackt,使用者在使用之前 最好調用av_dup_packet進行緩衝區的複製,將其轉化為緩衝區能夠被釋放的AVPacket,以免對緩衝區的不當佔用造成異常錯誤。而 av_dup_packet會為destruct指標為av_destruct_packet_nofree的AVPacket建立一個緩衝區,然後將原
緩衝區的資料拷貝至新緩衝區,置data的值為新緩衝區的地址,同時設destruct指標為av_destruct_packet。

時間資訊

 時間資訊用於實現多媒體同步。

 同步的目的在於展示多媒體資訊時,能夠保持媒體對象之間固有的時間關係。同步有兩類,一類是流內同步,其主要任務是保證單個媒體流內的時間關係,以滿足感知 要求,如按照規定的幀率播放一段視頻;另一類是流間同步,主要任務是保證不同媒體流之間的時間關係,如音頻和視頻之間的關係(lipsync)。

 對於固定速率的媒體,如固定幀率的視頻或固定位元速率的音頻,可以將時間資訊(幀率或位元速率)置於檔案首部(header),如AVI的hdrl List、MP4的moov box,還有一種相對複雜的方案是將時間資訊嵌入媒體流的內部,如MPEG TS和Real video,這種方案可以處理變速率的媒體,亦可有效避免同步過程中的時間漂移。

 FFMPEG會為每一個資料包打上時間標 簽,以更有效地支援上層應用的同步機制。時間標籤有兩種,一種是DTS,稱為解碼時間標籤,另一種是PTS,稱為顯示時間標籤。對於聲音來說 ,這兩個時間標籤是相同的,但對於某些視頻編碼格式,由於採用了雙向預測技術,會造成DTS和PTS的不一致。

時間資訊的擷取:

 通過調用av_find_stream_info,多媒體應用可以從AVFormatContext對象中拿到媒體檔案的時間資訊:主要是總時間長度和開始時間,此外還有與時間資訊相關的位元速率和檔案大小。其中時間資訊的單位是AV_TIME_BASE:微秒。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.