文章目錄
- 一、常用音視訊術語和概念
- 二、常用概念
- 三、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; 存儲一幀解碼後的資料(可以是視訊解碼後的像素資料,也可以是音頻采樣後的資料);