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

在这里插入图片描述

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

文章目录

  • 前期博客
  • 一、音视频常用术语
  • 二、FFmpeg库的结构介绍
  • 三、FFmpeg的常用函数
      • 初始化
      • 封装格式
      • 编解码器相关
  • 四、FFmpeg常用的数据结构

前期博客

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

一、音视频常用术语

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

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

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

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

    • 编解码器是一组算法,用于将原始数据(如视频或音频信号)编码成压缩格式,以及将压缩数据解码回原始格式。
    • 编解码器通常以帧为单位工作,将每一帧数据转换成压缩格式,或者从压缩格式转换回原始格式。
    • 编解码器的效率和质量直接影响到媒体内容的存储大小和播放质量。
  5. 复用器(Multiplexer)/ 解复用器(Demultiplexer)
    在数字媒体处理中,复用器和解复用器是两个关键组件,它们分别负责将多个媒体流组合成一个容器文件,以及将容器文件中的媒体流分离出来。

在这里插入图片描述
6. 编解码器
在这里插入图片描述

二、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(高度)等。

至此,结束~
在这里插入图片描述
望诸位不忘三连支持一下~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FastCGI简述

FastCGI (FCGI) 是一种协议,用于改善 Web 服务器和应用程序之间的通信效率。它是在 CGI(Common Gateway Interface)的基础上发展起来的,旨在解决 CGI 在处理大量并发请求时存在的性能问题。 CGI的由来 最早的Web服务器只能简单地…

WHAT - Jamstack(JavaScript, APIs, and Markup 与 Serverless 无服务器架构)

目录 一、介绍1. JavaScript2. APIs3. Markup4. Jamstack 的优势5. Jamstack 架构的工作流程 二、常见的 Jamstack 技术栈三、无服务器架构(Serverless)无服务器架构的核心概念1. 函数即服务(FaaS)2. 后端即服务(BaaS&…

解决 JS WebSocket 心跳检测 重连

解决 JS WebSocket 心跳检测 重连 文章目录 解决 JS WebSocket 心跳检测 重连一、WebSocket 心跳检测的作用二、心跳检测的处理方案1. 创建 WebSocket 连接2. 心跳参数设置3. 心跳检测逻辑4. 心跳包响应处理5. 断线重连机制 三、总结 一、WebSocket 心跳检测的作用 WebSocket 是…

序列化组件对比

1、msgpack介绍 1.MsgPack产生的数据更小,从而在数据传输过程中网络压力更小 2.MsgPack兼容性差,必须按照顺序保存字段 3.MsgPack是二进制序列化格式,兼容跨语言 官网地址: https://msgpack.org/ 官方介绍:Its lik…

C++ 移动构造函数为什么设置noexcept?

答案显然是&#xff1a; 移动构造函数设置了noexcept后STL的容器可以显著提高性能。 For example: class MyClass { public:MyClass(int v) { val v; }MyClass(const MyClass& o) {val o.val;std::cout << "Copy constructor " << val << …

Go 语言协程管理精解

1.基础 协程切换需要操作寄存器&#xff0c;这些操作需要通过汇编辅助实现。另外&#xff0c;每一个协程都有一个协程栈&#xff0c;实际上协程栈也是有结构的。汇编程序和栈结构这些概念可能大部分开发者都不太了解&#xff0c;在介绍协程管理之间&#xff0c;先简要介绍。 1…

一、undo log、Buffer Pool、WAL、redo log

目录 1、undo log2、Buffer Pool3、WAL4、redo log5、总结6、问题 1、undo log undo log日志是一种用于撤销回退的逻辑日志&#xff0c;在事务未提交前会记录相反的操作到undo log&#xff0c;当事务回滚&#xff0c;使用undo log 进行回滚&#xff0c;保证了事务的原子性。MV…

【生活英语】1、高兴与难过

【生活英语】1、高兴与难过 一、我非常非常开心二、心情三、不开心四、运气五、英语对话1、We broke up2、中奖了 一、我非常非常开心 (1) I’m really happy. (2) I’m really overjoyed. (3) I couldn’t be happier. I couldn’t agree with you more. 我非常赞同你。 (4) …

C++ TinyWebServer项目总结(8. 高性能服务器程序框架)

《Linux 高性能服务器编程》一书中&#xff0c;把这一章节作为全书的核心&#xff0c;同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后&#xff0c;正式进入了 Web 服务器项目的核心部分&#xff01; 前置内容回顾&#xff1a; 1. C TinyWebServer项目总结&…

每日一问:GET请求和POST请求的区别

每日一问&#xff1a;GET请求和POST请求的区别 在Web开发中&#xff0c;GET请求和POST请求是最常见的两种HTTP请求方法。尽管它们在功能上有许多相似之处&#xff0c;但在使用场景、数据传递方式、缓存策略等方面存在显著差异。了解这些区别不仅有助于我们在开发中做出正确的选…

Docker拉取镜像-2024-07-有效

Docker拉取镜像-有效 配置加速地址 首先&#xff0c;创建Docker配置目录&#xff1a;sudo mkdir -p /etc/docker然后&#xff0c;编辑daemon.json文件&#xff0c;添加以下加速地址&#xff1a;sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors"…

go gc信息如何查看

目录 1.几种常见方法1.1.设置环境变量 GODEBUG打印GC日志1.2.使用 debug.ReadGCStats1.3.使用 runtime.ReadMemStats 2.GC日志打印示例3.参考 在Go语言中&#xff0c;可以通过设置环境变量和使用运行时包中的调试功能来打印垃圾回收&#xff08;GC&#xff09;的信息。 1.几种…

等保测评中的安全测试方法

等保测评&#xff0c;即信息安全等级保护测评&#xff0c;是我国网络安全领域的重要评估机制&#xff0c;用于验证网络系统或应用是否满足相应的安全保护等级要求。在等保测评中&#xff0c;安全测试方法扮演着至关重要的角色。本文将详细介绍等保测评中常用的安全测试方法及其…

LinkedHashMap和TreeMap的基本使用

一.LinkedHashMap集合&#xff1a;&#xff08;是HashMap集合的儿子&#xff0c;Map集合的孙子&#xff09; 1.特点&#xff1a; 2.代码实现&#xff1a; 1)键的唯一性&#xff1a; package com.itheima.a01myMap; ​ import java.util.LinkedHashMap; ​ public class A07_…

二十三种模式之单例模式(基础了解)

1.设计模式的分类 创建型模式(五种)&#xff1a;工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。结构型模式(七种)&#xff1a;适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。行为型模式(十一种)&#xff1a;状态模式、模板方法…

Flamingo中的Perceiver Resampler

在 Flamingo 模型中&#xff0c;Perceiver Resampler 是一个关键组件&#xff0c;用于将输入的多模态数据&#xff08;如图像和文本&#xff09;转化为适合Transformer处理的表示形式。具体来说&#xff0c;它是为了解决高维视觉输入&#xff08;如图像&#xff09;和低维语言表…

【Docker项目实战】使用Docker部署webtop桌面版Linux环境

【Docker项目实战】使用Docker部署webtop桌面版Linux环境 一、webtop介绍1.1 webtop简介1.2 主要特点1.3 使用场景二、webtop相关说明2.2 webtop支持架构2.2 镜像版本说明三、本地环境介绍3.1 本地环境规划3.2 本次实践介绍四、本地环境检查4.1 检查Docker服务状态4.2 检查Dock…

YOLOv8目标检测部署RK3588全过程,附代码pt->onnx->rknn,附【详细代码】

目录 一、训练yolov8模型&#xff0c;得到最佳权重文件best.pt 二、pt转onnx,即best.pt->best11.onnx 1、对下载的YOLOv8代码修改 2、加入模型导出功能&#xff0c; 3、导出指令采用如下代码 三、ONNX转RKNN 四、RK3588部署 1、拷贝rknn文件到rk3588板子内 2、执行…

48.x86游戏实战-封包抓取进图call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

使用Supervisor守护Nginx进程

supervisor是个好工具。superviosr是一个Linux/Unix系统上的进程监控工具&#xff0c;Supervisor是用Python开发的一套通用的进程管理程序&#xff0c;能将一个普通的命令行进程变为后台daemon&#xff0c;并监控进程状态&#xff0c;异常退出时能自动重启。只要在supervisor的…