天天看點

FFmpeg常用庫、術語、API、資料結構總結

文章目錄

  • 一、常用音視訊術語和概念
  • 二、常用概念
  • 三、FFmpeg庫簡介
  • 四、ffmpeg常用函數簡介(一)關于初始化和注冊相關的函數(二)封裝格式相關函數(三)解碼相關函數
  • 五、ffmpeg常用資料結構簡介

一、常用音視訊術語和概念

  • 容器/檔案(Conainer/File):指特定格式的多媒體檔案,比如mp4、flv、mov等視訊格式;
  • 媒體流(Stream):一個容器(如mp4檔案)中可存在多個流,可以是視訊流、音頻流、字幕流。
  • 資料幀/資料包(Frame/Packet):一個流媒體是由大量的資料幀構成的。
  • 編碼器/解碼器:編解碼器是以幀為機關進行壓縮資料和複原資料的,對原始資料和壓縮的資料進行轉換。

例如:通過如下指令可以檢視一個視訊檔案的資訊:

zhenghui@zh-pc:~/視訊$ ffprobe 1080P.mp4 
ffprobe version N-104612-g3188b606d7 Copyright (c) 2007-2021 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
  configuration: --prefix=/usr/local/ffmpeg --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-filter=delogo --enable-debug --disable-optimizations --enable-libspeex --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --cc=gcc --host-cflags= --host-ldflags= --disable-x86asm
  libavutil      57.  9.100 / 57.  9.100
  libavcodec     59. 13.100 / 59. 13.100
  libavformat    59.  9.101 / 59.  9.101
  libavdevice    59.  0.101 / 59.  0.101
  libavfilter     8. 17.100 /  8. 17.100
  libswscale      6.  1.100 /  6.  1.100
  libswresample   4.  0.100 /  4.  0.100
  libpostproc    56.  0.100 / 56.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1080P.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
    description     : Packed by Bilibili XCoder v2.0.2
  Duration: 00:03:46.53, start: 0.000000, bitrate: 3087 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2951 kb/s, 30 fps, 30 tbr, 16k tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
zhenghui@zh-pc:~/視訊$            

可以看到這個視訊中有兩路流:

  • Stream #0:00x1: Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2951 kb/s, 30 fps, 30 tbr, 16k tbn (default)
  • Stream #0:10x2: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)

一路是視訊流Video: h264,一路是音頻流Audio: aac。

領音視訊開發資料→音視訊開發(資料文檔+視訊教程+項目源碼)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)

二、常用概念

音視訊領域-複用器和解複用器

  • 複用器:把多路原始流按一定的規則組成成一個新的音視訊檔案(例如:把一個純視訊流、一個純音頻流和一個純字幕流組合成一個mp4檔案);
  • 解複用器:把一個新的音視訊檔案按一定的規則拆分成多路原始流(例如:把一個mp4檔案,拆分成純視訊流、純音頻流和純字幕流)。

三、FFmpeg庫簡介

ffmpeg常用的庫: ​

  • libavutil
核心工具庫,例如log子產品。在ffmpeg中很多功能子產品都會依賴avutil庫作一些基本的音視訊操作。
  • libavformat(*重要)
檔案格式和協定庫,該子產品是最重要的子產品之一,封裝了Protocol層和Demuxer、Muxer層。
  • libavcodec(*重要)
編解碼庫,封裝了一些基本的Codec層。但是一些Codec是具備自己的License的,是以ffmpeg是沒有預設把這類的庫添加進來的,例如:libx264,FDK-AAC等庫。ffmpeg就像一個平台一樣,可以将第三方的Codec以插件的方式添加進來,然後為開發者提供統一的接口,進行使用。
  • libswresample (*重要)
該子產品用于音頻重采樣,可以對數字音頻進行聲道數、資料格式、采樣率等多種基本資訊進行轉換。例如:把一段音頻的聲道由雙聲道轉換成單聲道的資料,就可以通過該庫進行操作。
  • libswscale(*重要)
該子產品提供了将圖像進行格式資訊轉換的子產品。例如:可以将YUV資料轉換成RGB資料,可以将1280720的尺寸的資料縮放尺寸至800480的資料。
  • libavfilter
音視訊濾鏡庫,該庫提供了音頻和視訊特效的處理功能。
  • libavdevice
輸入輸出裝置庫。編譯時需要先編譯SDL,因為此庫是以來SDL的,該裝置子產品庫播放聲音與播放視訊使用的都是SDL庫。
  • libpostproc
該年子產品用于後期處理,與libavfilter庫配合使用。

四、ffmpeg常用函數簡介

(一)關于初始化和注冊相關的函數

  • av_register_all():注冊所有的組建,4.0及以上版本已經棄用了;
  • avdevice_register_all():對裝置進行注冊,如果我們要捕捉螢幕進行錄制螢幕,捕捉攝像頭進行錄制視訊,捕捉麥克風錄制麥克風聲音時,就需要使用到該函數,首先進行注冊。例如(windows下的dshow,Linux下的V4L2等);
  • avformat_network_init():初始化網絡庫以及網絡加密協定相關的庫,我們在推流或者拉流時就會使用到。

(二)封裝格式相關函數

  • avformat_alloc_context():負責申請一個AVFormatContext上下文結構體的記憶體,并進行簡單的初始化,以提供給其他函數使用;
  • avformat_free_context():釋放不使用的AVFormatContext;
  • avformat_close_input():關閉解複用器。如果使用該函數進行關閉的話,就可以不使用avformat_free_context()進行釋放;
  • avformat_open_input():打開輸入視訊檔案;
  • avformat_find_stream_info():擷取視訊檔案資訊;
  • av_read_frame():讀取音視訊包;
  • avformat_seek_file():根據時間戳定位檔案的位置;例如我們托方播放器的進度條進行快近和快退時,就可以使用此函數進行定位播放;
  • av_seek_frame():根據流的大小定位檔案的位置;

封裝格式步驟: 1、配置設定解複用器上下文(avformat_alloc_context()); 2、根據url打開本地檔案或網絡流(avformat_open_input()); 3、讀取媒體的資料包,查找流資訊(avformat_find_stream_info()); 4、周遊資料 (4-1)、從檔案中讀取資料包(av_read_frame()); (4-2)、或者 定位檔案位置進行周遊(avformat_seek_file()、av_seek_frame()); 5、關閉解複用器(avformat_close_input())或釋放不使用的資源; ​

(三)解碼相關函數

  • avcodec_alloc_context3();配置設定解碼器上下文;
  • avcodec_find_decoder();根據ID查找解碼器;
  • avcodec_find_decoder_by_name();根據解碼器名字查找解碼器;
  • avcodec_open2();打開編解碼器;
  • avcodec_send_packet();發送編碼資料包;
  • avcodec_receive_frame();接受解碼後的資料;
  • avcodec_free_context();釋放解碼器上下文,此函數包含了avcodec_close();
  • avcodec_close();關閉解碼器;

五、ffmpeg常用資料結構簡介

  • AVFormatContext; 封裝格式上喜愛文結構體,統領全局的結構體,儲存了視訊檔案封裝格式等相關資訊;
  • AVInputFormat; 輸入的format;封裝格式(例如:FLV、MP4),每個封裝格式都對應一個該結構體;
  • AVOutputFormat;輸出的format,例如:輸出到網絡流,輸出到檔案等;
  • AVStream;一個視訊容器(即檔案)中存在多路流資料,每路流都對應一個該結構體,例如:視訊流、音頻流、字幕流等;
  • AVCodecContext; 編解碼器上下文結構體,儲存了音視訊編解碼相關的資訊;
  • AVCodec; 每一種音視訊編解碼器(例如:H.264解碼器)都對應一個該結構體;
  • AVPacket;存儲一幀壓縮編碼資料;
  • AVFrame; 存儲一幀解碼後的資料(可以是視訊解碼後的像素資料,也可以是音頻采樣後的資料);

繼續閱讀