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.rhkb.cn/news/405741.html

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

相关文章

安装搭建MongoDB及配置副本集

目录 一、什么是MongoDB的副本集 简介 (1)冗余和数据可用性 (2)MongoDB中的复制 (3)主从复制和副本集区别 二、副本集的架构 三、副本集的成员 四、部署副本集 1、节点划分 2、安装MongoDB 2.1、…

Jetpack 各种框架简介

Jetpack是Google推出的一套为Android开发提供极大便利的组件、工具和指导集,旨在帮助开发者快速构建高质量的应用,并遵循最佳实践。 Jetpack不仅是一个提高开发效率的工具集,还是Android开发的未来方向。它通过整合各种组件和工具&#xff0…

VAuditDemo审计之二次注入漏洞

目录 VAuditDemo二次注入漏洞 搜索危险函数,用户可控点 regCheck.php messageSub.php message.php 漏洞调用链 漏洞错误利用过程 注册用户 xxxx, 发表payload留言 漏洞正确利用过程 注册用户 wwww\ 退出用户 wwww\\ 使用 wwww\ 登录 发表留言 替换dat…

【全网最真实测评】随身WiFi值得入手吗?自费入手华为、中兴、格行、上赞4款随身WiFi,内含国产4款热门随身WiFi推荐!(最实用、最高性价比!)

随身WiFi的风越吹越大,市场乱象也更变本加厉。作为一名资深随身WiFi使用者,接触过太多的随身WiFi产品,越是了解这个行业黑幕,就越对无良商家夸大宣传、虚标限速,甚至售卖二手产品的行为深恶痛绝! 本篇测评涉…

学习嵌入式第二十九天

ipc进程间通信方式 PC,即进程间通信(Inter-Process Communication),是操作系统中不同进程之间交换数据的一种机制。以下是一些常见的IPC方式: 管道:用于父子进程或兄弟进程之间的通信。消息队列&#xff…

nestjs nest-cli.json中的assets不生效

官方文档 Documentation | NestJS - A progressive Node.js framework // nest-cli.json{"collection": "nestjs/schematics","sourceRoot": "src","compilerOptions": {"assets": ["microservices/mail/te…

【网络编程】select实现服务器与客户端进行通信

1、运行1个服务器和2个客户端 实现效果: 1、服务器和2个客户端互相聊天,服务器和客户端都需要使用select模型去实现 2、服务器要监视2个客户端是否连接,2个客户端是否发来消息,以及服务器自己的标准输入流 3、客户端…

定格精彩瞬间!详解六自由度技术原理及应用

在体育赛事中,观赏各项目的精彩瞬间,欣赏运动员的卓越表现是观众们最为关注的焦点。以体操跳马为例,运动员们全力助跑,然后奋力起跳、腾空,接着精准的推手和转体动作,最后稳稳落地,整个动作行云…

检测到目标URL存在http host头攻击漏洞

漏洞描述 修复措施 方法一: nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。 server { …

avue-crud 自定义搜索项 插槽

加上 -search 就可以自定义查询项了

【MongoDB】Java连接MongoDB

连接URI 连接 URI提供驱动程序用于连接到 MongoDB 部署的指令集。该指令集指示驱动程序应如何连接到 MongoDB,以及在连接时应如何运行。下图解释了示例连接 URI 的各个部分: 连接的URI 主要分为 以下四个部分 第一部分 连接协议 示例中使用的 连接到具有…

ant design pro 中用户的表单如何控制多个角色

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的 看上面的图片 当创建或编辑一个用户时,…

Mac文件需要分卷压缩怎么办 Mac上怎么解压分卷压缩的文件

在处理大型文件的传输和存储的时候,Mac用户常面临文件大小超过限制的问题。为了有效管理这些大文件,分卷压缩成为一种必不可少的解决方案。Mac文件需要分卷压缩怎么办?Mac上怎么解压分卷压缩的文件?本文将向你介绍如何使用BetterZ…

第R2周:LSTM-火灾温度预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、什么是LSTM 1.LSTM的本质 长短时记忆网络(Long Short-Term Memory, LSTM)的本质是一种特殊的循环神经网络(Recurrent…

使用Go语言将PDF文件转换为Base64编码

使用 Go 语言将 Base64 编码转换为 PDF 文件-CSDN博客本文介绍了如何使用 Go 语言将 Base64 编码转换为 PDF 文件,并保存到指定路径。https://blog.csdn.net/qq_45519030/article/details/141225772 在现代编程中,数据转换和编码是常见的需求。本文将介绍…

SX_gitlab可视化操作c语言知识_17

gitlab可视化操作技巧: Merge into current branch直接将远程wjc_GNSS分支的数据拉下来同步到本机当前的分支代码,执行的是合并操作,即多的模块会添加到本地分支,有冲突的地方不行得rebase覆盖才行 修改完代码先暂存更改再在暂存区写入备注&a…

网络通信要素

网络介绍 定义:将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。 学习网络的目的: 能够编写基于网络通信的软件或程序,通常来说就是网…

力扣面试经典算法150题:删除有序数组中的重复项 II

删除有序数组中的重复项 II 今天的题目是力扣面试经典150题中的数组的中等难度题: 删除有序数组中的重复项 II 题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 题…

时间序列分析2|ARIMA模型|SARIMA模型

ARMA模型的定阶 自相关和偏自相关系数法 通过观察样本的自相关系数(ACF)和偏自相关系数(PACF),进行大体的判断 模型定阶的经验方法 截尾: 最初的d阶样本(偏)自相关系数明显在2倍标准差范围外95%的(偏)自相关系数都落在2倍标准差的范围以内非零自相…

【论文阅读】通用的语义-几何表征的机器人操作

文章目录 1. 【2023CoRL】A Universal Semantic-Geometric Representation for Robotic Manipulation针对痛点和贡献引言模型框架思考不足之处 2. Leveraging Locality to Boost Sample Efficiency in Robotic Manipulation摘要和结论引言模型框架实验思考不足之处 1. 【2023Co…