一、常用音视频术语和概念
容器/文件(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。
二、常用概念
音视频领域-复用器和解复用器
- 复用器:把多路原始流按一定的规则组成成一个新的音视频文件(例如:把一个纯视频流、一个纯音频流和一个纯字幕流组合成一个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常用函数简介
(一)关于初始化和注册相关的函数
:注册所有的组建,4.0及以上版本已经弃用了;av_register_all()
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
; 存储一帧解码后的数据(可以是视频解码后的像素数据,也可以是音频采样后的数据);
还得跟着0声Darren哥学着走阿!