FFmpeg的入门实践系列三(基础知识)

欢迎诸位来阅读在下的博文~

在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力

文章目录

前期博客

FFmpeg的入门实践系列一(环境搭建)
FFmpeg的入门实践系列二(基础知识)

一、音视频常用术语

  1. 容器/文件(Container/File)

    • 容器是一种文件格式,用于将多种媒体流(如视频、音频、字幕等)组合成一个单一的文件。
    • 它定义了如何存储和访问这些媒体流,以及如何处理它们之间的同步和交互。
    • 常见的容器格式包括MP4、FLV、MKV等,每种格式都有其特定的用途和优势。
  2. 媒体流(Stream)

    • 媒体流是时间轴上的一段连续数据,可以是音频、视频或字幕等。
    • 媒体流可以是压缩的,也可以是非压缩的。压缩的媒体流需要关联特定的编解码器才能进行解压缩和播放。
    • 在容器文件中,不同的媒体流可以独立存储,但它们通常需要同步播放。
  3. 数据帧/数据包(Frame/Packet)

    • 数据帧是媒体流的基本单元,对于压缩数据,帧通常对应编解码器的最小处理单元。
    • 数据包是网络传输中的概念,它是在网络中传输的分组,可以包含一个或多个数据帧。
    • 在容器文件中,不同媒体流的数据帧通常是交错存储的,以支持同步播放。
  4. 编解码器(Codec)

    • 编解码器是一组算法,用于将原始数据(如视频或音频信号)编码成压缩格式,以及将压缩数据解码回原始格式。
    • 编解码器通常以帧为单位工作,将每一帧数据转换成压缩格式,或者从压缩格式转换回原始格式。
    • 编解码器的效率和质量直接影响到媒体内容的存储大小和播放质量。
  5. 复用器(Multiplexer)/ 解复用器(Demultiplexer)

    在数字媒体处理中,复用器和解复用器是两个关键组件,它们分别负责将多个媒体流组合成一个容器文件,以及将容器文件中的媒体流分离出来。

  1. 编解码器

二、FFmpeg库的结构介绍

FFmpeg的8个常用库的简要说明:

库名称 功能描述
AVUtil 核心工具库,提供基本的数据结构和实用函数。其他模块依赖AVUtil进行基本的音视频处理操作。
AVFormat 文件格式和协议库,处理多媒体文件的封装和解封装。封装了协议层、解复用器(Demuxer)和复用器(Muxer)层。
AVCodec 编解码库,处理音视频的编码和解码。支持多种编解码器,包括第三方编解码器如libx264、FDK-AAC等。
AVFilter 音视频滤镜库,提供音视频特效处理。可以直接在编解码过程中使用,方便高效。
AVDevice 输入输出设备库,用于处理音视频的输入输出。比如ffplay播放器就需要这个模块来播放声音和视频。
SwrRessample 音频重采样库,用于音频数据的转换,如声道数、数据格式、采样率等。
SWScale 图像格式转换库,如YUV到RGB的转换,以及图像的缩放。
PostProc 后期处理库,用于视频后期的处理,如去块效应、降噪等。在使用AVFilter时,可能需要打开PostProc模块。

三、FFmpeg的常用函数

初始化

  1. av_register_all()
    • 功能:这个函数用于注册所有的编解码器、复用器、解复用器和协议。在早期的FFmpeg版本中,这是必须调用的,以便使用FFmpeg的编解码功能。
    • 弃用:从FFmpeg 4.0开始,这个函数已经被弃用,因为现在FFmpeg会自动注册所有的组件,所以不再需要显式调用这个函数。
  2. avdevice_register_all()
    • 功能:这个函数用于注册所有的输入和输出设备,比如V4L2(Video4Linux2),它是Linux系统下的一种视频捕获API。
    • 使用场景:当你需要从或向硬件设备捕获/输出数据时,应该调用这个函数。
  3. avformat_network_init()
    • 功能:这个函数用于初始化网络库,包括网络协议和加密协议相关的库,比如OpenSSL。
    • 使用场景:如果你打算使用FFmpeg进行网络流处理,比如从一个网络摄像头获取视频流,或者通过网络发送视频流,应该在程序开始时调用这个函数。

封装格式

  1. avformat_alloc_context()
    • 功能:分配并初始化一个 AVFormatContext 结构体,该结构体用于存储关于媒体文件格式或流的信息。这个函数会分配内存并设置一些默认值。
  2. avformat_free_context()
    • 功能:释放由 avformat_alloc_context() 分配的 AVFormatContext 结构体及其包含的所有资源。这包括所有的流、编解码器上下文、缓冲区等。
  3. avformat_close_input()
    • 功能:关闭解复用器,并释放与 AVFormatContext 相关的所有资源。这个函数应该在完成文件处理后调用,以避免内存泄漏。调用这个函数后,就不需要再调用 avformat_free_context()
  4. avformat_open_input()
    • 功能:打开指定的媒体文件,并读取文件头,初始化 AVFormatContext。这个函数会自动检测文件的格式,并分配必要的资源。
  5. avformat_find_stream_info()
    • 功能:读取媒体文件或流的信息,并填充 AVFormatContext 中的流信息,如编解码器、时间基、帧率等。这个函数对于获取流信息非常重要。
  6. av_read_frame()
    • 功能:从媒体文件中读取一个音视频包(AVPacket)。这个函数通常在一个循环中被调用,以逐个读取媒体流中的所有包。
  7. avformat_seek_file()
    • 功能:在媒体文件中定位到一个特定的位置。这个函数可以用来进行精确的定位,比如跳转到特定的帧或时间点。
  8. av_seek_frame()
    • 功能:这个函数已经被 avformat_seek_file() 取代,不建议使用。avformat_seek_file() 提供了更灵活的定位功能。
      在使用这些函数时,请注意以下事项:
  • 在打开文件后,确保在处理完成后关闭文件并释放资源。
  • 在使用 avformat_find_stream_info() 之前,应该已经调用了 avformat_open_input()
  • 在读取数据之前,确保已经找到了流信息。
  • 在定位媒体文件时,要注意时间基和帧率,以确保定位到正确的位置。

编解码器相关

  1. avcodec_alloc_context3()
    • 功能:分配并初始化一个 AVCodecContext 结构体,该结构体用于存储关于编解码器的信息。这个函数会分配内存并设置一些默认值。
  2. avcodec_find_decoder()
    • 功能:根据编解码器的ID查找解码器。这个ID通常是一个枚举值,如 AV_CODEC_ID_H264
  3. avcodec_find_decoder_by_name()
    • 功能:根据解码器的名称查找解码器。这个函数通常用于当编解码器的ID未知,但你知道其名称时。
  4. avcodec_open2()
    • 功能:打开一个编解码器。这个函数会初始化 AVCodecContext,并准备进行编解码操作。
  5. avcodec_decode_video2()
    • 功能:解码一帧视频数据。这个函数已经被新的API avcodec_send_packet()avcodec_receive_frame() 取代,但在某些情况下仍然可以使用。
  6. avcodec_decode_audio4()
    • 功能:解码一帧音频数据。这个函数也是旧的API,新的API是 avcodec_send_packet()avcodec_receive_frame()
  7. avcodec_send_packet()
    • 功能:发送一个编码数据包到解码器。这个函数是新的解码API的一部分,用于将压缩数据传递给解码器。
  8. avcodec_receive_frame()
    • 功能:接收解码后的数据。这个函数是新的解码API的一部分,用于从解码器获取解码后的帧。
  9. avcodec_free_context()
    • 功能:释放由 avcodec_alloc_context3() 分配的 AVCodecContext 结构体及其包含的所有资源。这个函数会调用 avcodec_close() 来关闭解码器。
  10. avcodec_close()
    • 功能:关闭解码器。这个函数会释放与 AVCodecContext 相关的所有资源,但不包括 AVCodecContext 结构体本身。通常,你应该使用 avcodec_free_context() 来关闭和解码器上下文。

在使用这些函数时,请注意以下事项:

  • 在打开编解码器之前,确保已经分配了 AVCodecContext
  • 在解码之前,确保已经找到了正确的解码器。
  • 在解码过程中,使用 avcodec_send_packet()avcodec_receive_frame() 来发送和接收数据。
  • 在完成解码后,确保释放 AVCodecContext 和关闭解码器。

四、FFmpeg常用的数据结构

  1. AVFormatContext
    • 描述:这是一个包含多媒体文件格式信息的上下文结构体。它是一个全局性的结构体,用于存储关于整个媒体文件的信息,包括封装格式、流信息、时间基等。
    • 关键属性:iformat(输入格式)、oformat(输出格式)、streams(流数组)、duration(时长)等。
  2. AVInputFormat
    • 描述:每种输入封装格式(如FLV、MKV、MP4、AVI)都有一个对应的 AVInputFormat 结构体。它包含了关于如何读取特定格式文件的信息。
    • 关键属性:name(格式名称)、long_name(格式长名称)、extensions(文件扩展名数组)等。
  3. AVOutputFormat
    • 描述:与 AVInputFormat 类似,但用于输出。它定义了如何写入特定格式的媒体文件。
  4. AVStream
    • 描述:媒体文件中的每个视频或音频流都对应一个 AVStream 结构体。它包含了关于流的编解码器信息、时间基、帧率等。
    • 关键属性:codec(编解码器上下文)、time_base(时间基)、r_frame_rate(帧率)等。
  5. AVCodecContext
    • 描述:这是一个包含编解码器信息的上下文结构体。它用于存储特定视频或音频流的编解码器设置和状态。
    • 关键属性:codec(编解码器)、width(视频宽度)、height(视频高度)、sample_rate(音频采样率)等。
  6. AVCodec
    • 描述:每种视频或音频编解码器(如H.264解码器)都有一个对应的 AVCodec 结构体。它包含了关于编解码器的静态信息,如编解码器的名称和ID。
    • 关键属性:name(编解码器名称)、id(编解码器ID)等。
  7. AVPacket
    • 描述:用于存储一帧压缩编码数据。它通常在编解码器之间传递数据包。
    • 关键属性:data(数据指针)、size(数据大小)、pts(显示时间戳)等。
  8. AVFrame
    • 描述:用于存储一帧解码后的像素(对于视频)或采样(对于音频)数据。它包含了关于帧的宽、高、格式等信息。
    • 关键属性:data(数据指针数组)、linesize(行大小数组)、width(宽度)、height(高度)等。

至此,结束~

望诸位不忘三连支持一下~

相关推荐
岁月小龙2 小时前
如何让ffmpeg运行时从当前目录加载库,而不是从/lib64
ffmpeg·origin·ffprobe·rpath
行者记1 天前
ffmpeg命令——从wireshark包中的rtp包中分离h264
测试工具·ffmpeg·wireshark
EasyCVR1 天前
国标GB28181视频平台EasyCVR私有化视频平台工地防盗视频监控系统方案
运维·科技·ffmpeg·音视频·1024程序员节·监控视频接入
hypoqqq1 天前
使用ffmpeg播放rtsp视频流
ffmpeg
cuijiecheng20181 天前
音视频入门基础:FLV专题(24)——FFmpeg源码中,获取FLV文件视频信息的实现
ffmpeg·音视频
QMCY_jason1 天前
黑豹X2 armbian 编译rkmpp ffmpeg 实现CPU视频转码
ffmpeg
苍天饶过谁?1 天前
SDL基本使用
ffmpeg
HZ355721 天前
ffmpeg视频解码
ffmpeg·音视频
runing_an_min2 天前
windows运行ffmpeg的脚本报错:av_ts2str、av_ts2timestr、av_err2str => E0029 C4576
c++·windows·ffmpeg·e0029
EelBarb2 天前
ffmpeg:视频字幕嵌入(GPU加速)
ffmpeg·音视频