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

news2024/11/26 4:22:29

在这里插入图片描述

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

文章目录

  • 前期博客
  • 一、音视频常用术语
  • 二、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.coloradmin.cn/o/2063311.html

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

相关文章

备战秋招60天算法挑战,Day23

题目链接&#xff1a; https://leetcode.cn/problems/counting-bits/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1RE421w7C7/ LeetCode 338. 比特位计数 题目描述 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中…

我店平台商业模式案例分析

我店平台是一家综合性的新消费平台&#xff0c;其商业模式结合了“互联网实体终端”的理念&#xff0c;通过数字化技术促进消费生态的升级和变革。以下是对该平台商业模式的概述&#xff1a; 平台定位 我店平台的目标是建立一个消费者、商家和平台三者都能从中受益的消费生态圈…

特斯拉电动卡车事故引发安全调查,汽车制造商电动车战略调整

特斯拉电动卡车事故引关注 周三&#xff0c;美国国家运输安全委员会宣布启动对特斯拉电动半挂卡车在加州高速上发生的事故及随后起火事件的全面调查。此次调查将联合加州公路巡警局共同进行&#xff0c;旨在查明事故原因&#xff0c;确保道路安全。事故发生在周一深夜&#xff…

性价比运动耳机有哪些?五大性价比运动耳机推荐!

作为一名资深的数码爱好者&#xff0c;我一直对各种新型耳机产品保持着浓厚的兴趣。最近&#xff0c;我因为很多运动爱好者都在询问什么耳机是比较适合运动的时候使用的&#xff0c;看了市面上的产品&#xff0c;开放式耳机无疑是一个不错的选择&#xff0c;它因为采用人体工学…

控制反转(IOC)——Spring第一个核心思想

控制反转概述 控制反转&#xff08;IoC&#xff09;是一种将对象的创建、组装和管理交给容器或框架来实现的编程思想。它可以减低对象之间的耦合度&#xff0c;提高代码的灵活性和模块化。控制反转的一种常见形式是依赖注入&#xff08;DI&#xff09;&#xff0c;即对象的依赖…

Godot模拟实现多人游戏平滑移动

最近几天接触到Godot,发现是一个很不错的免费开源游戏引擎,游戏本身实现了多人对战游戏之间同步功能(好像更适合于即时对战类,而且对战人数对计算机的性能要求高); 如果要实现一个大型的游戏,1个服务端(长期运行)对应N多个客户端(随时运行)需要怎么实现,不知道是不…

Rust到底值不值得学

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust是近两年呼声比较高的一种新型开发语言&#xff0c;市场占有量并不大&#xff0c;但增长速度极为迅猛。 有人统计过&#xff0c;…

【访客管理系统】基于低代码+golang+人脸识别技术实现的访客管理系统

概述 访客预约-审批-核验流程 5个步骤&#xff1a;生成邀约 -> 访客填写信息 -> 企业员工审批 -> 访客获取凭证 -> 访客核验入园 访客核验方式 4种方式&#xff1a;二维码&#xff0c;身份证&#xff0c;人证核验&#xff0c;人脸识别 工作台 资料管理 园区管…

消息可靠性

若支付服务和mq之前网络链接失败/mq挂掉/交易服务挂掉,都有可以让支付订单无法更新,所以导致发送者不可靠,mq本身不可靠,消费者不可靠,消息延迟,针对以下问题 生产者可靠性 支付服务和mq之间有可能连不上,连不上怎么办,可以增加失败重连 配置文件中配置-重连 测试结果…

栈相关的算法

抽象&#xff1a; 不能处理的信息&#xff1a;暂时入栈。 能处理的信息&#xff1a;从栈里面选择信息&#xff0c;加工处理&#xff0c;并出栈。 一、括号匹配算法 左括号等待匹配&#xff0c;所以入栈等待匹配。 右边括号就要判断是否匹配&#xff0c;所以判断是否匹配并出…

如何设置PowerBI报告展示在屏幕的大小?

问题描述: 业务部门同事反馈&#xff0c;将开发的Power BI报告发布到Power BI服务站点后&#xff0c;用户通过不同尺寸的电子设备打开报告看到的效果不一样&#xff0c;如用PC打开报告可以在一屏中完整显示所有报告可视化组件如图&#xff1a; 但是用手机或者PAD类小尺寸电子设…

【好书推荐】值得深读的EMC参考书籍

以下排序不分先后&#xff0c;都是好书&#xff01; 书名&#xff1a;Electromagnetic Compatibility Engineering 作者&#xff1a;Henry W. Ott 这本书的讨论重点放在了经济高效的EMC设计上&#xff0c;并将数学的数量和复杂度保持在最低限度&#xff0c;辅以 250 多个带有…

【Qt笔记】Qt建立UDP通信

目录 一、前言 二、服务端 ①在项目配置文件中加入network模板 ②创立一个继承自QObject的UdpServer的类 ③构造函数的实现 ④读取信息函数的实现 三、客户端 ①绑定服务端的IP地址和端口号 ②发送数据报给服务端 四、实现效果 一、前言 UDP&#xff08;User Datagr…

流苏马兜铃Aristolochia fimbriata参考基因组

推荐官网&#xff0c;一个和无油樟一样没发生过全基因组复制事件的代表性物种。 文章同链接 如何获取mostly单拷贝和strictly单拷贝基因 Insights into angiosperm evolution, floral development and chemical biosynthesis from the Aristolochia fimbriata genome https:…

微服务CI/CD实践(一)环境准备及虚拟机创建

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;gitlabs部署 微服务CI/CD实践&#xff08;三&#xff09;nexus3部署 微服务CI/CD实践&#xff08;四&#xff09;数据库,redis,n…

天猫商品评论API:获取商品热门评价与最新评价

天猫&#xff08;Tmall&#xff09;作为中国最大的B2C电商平台之一&#xff0c;提供了丰富的商品和服务。然而&#xff0c;天猫并没有直接公开一个通用的API来允许第三方开发者直接获取商品的热门评价或最新评价。这主要是出于保护用户隐私、防止恶意抓取和滥用数据等考虑。 不…

SpringIoCDI

前言&#x1f440;~ 上一章我们介绍了Spring MVC&#xff0c;今天介绍Spring核心功能之一IoC Spring到底是什么&#xff1f; Spring IoC 什么是 IoC 容器&#xff1f; IoC 介绍 DI 介绍 IoC详解 获取Bean对象的其他方式 Bean的存储 方法注解 Bean 扫描路径 DI详解 …

计算机网络——TCP协议与UDP协议详解(下)

一、TCP协议 1.1 TCP协议的报文 TCP全称为 "传输控制协议(Transmission Control Protocol")。人如其名&#xff0c;要对数据的传输进行一个详细的控制。我们先看其报文格式&#xff0c;如下图&#xff1a; TCP报文由以下几个字段组成&#xff1a; 源端口号和目标端口…

【第三版 系统集成项目管理工程师】第13章 监控过程组

持续更新。。。。。。。。。。。。。。。 【第三版】第十三章 监控过程组 13.1控制质量13.1.1主要输入1.项目管理计划-P4992.项目文件-P4993.批准的变更请求-P5004.可交付成果-P5005.工作绩效数据-P500 13.1.2主要工具与技术1.数据收集-P5002.数据分析-P5003.检查-P5014.测试/…

数据结构—— 初识二叉树

1.树概念及结构 1.1树的概念 树是由根和子树构成 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 1. 树有…