FFmpeg 结构体以及核心方法介绍

news2024/11/16 0:54:42

1.FFmpeg整体结构

在这里插入图片描述

ffplay、ffprobe、ffmpeg是上层的三个应用程序

libavutil:核心工具库,其他模块一般都会依赖这个模块做一些基本的音视频处理。

libavformat:文件格式协议库,封装了protocol层和demuxer、Muxer层,使得格式和协议对于开发者是透明的。

libavcodec:编解码库,封装了codec层,有一些codec具备自己的license,ffmpeg默认并不会自动添加x264、fdkaac等库,但是ffmpeg像一个平台一样,这些可以通过插件的方式集成进来,然后为开发者提供统一的接口。

libswscale:该模块是将图像进行格式转换的模块,比如,可以将YUV的数据转换为RGB的数据,缩放尺寸由1280720变为800480

libswresample:该模块可用于音频重采样,可以对数字音频进行声道数、数据格式、采样率等多种基本信息的转换

libavfilter:音视频滤镜库,该模块提供了包括音频特效和视频特效的处理,在使用FFmpeg的API进行编解码的过程中,直接使用该模块为音视频数据做特效处理是非常方便同时也非常高效的一种方式。

avdevice:输入输出设备库,比如,需要编译出播放声音或者视频的工具ffplay,就需要确保该模块是打开的,同时也需要SDL的预先编译,因为该设备模块播放声音与播放视频使用的都是SDL库。

libpostproc:该模块可用于进行后期处理,当我们使用AVFilter的时候需要打开该模块的开关,因为Filter中会使用到该模块的一些基

础函数。

2.初始化

av_register_all():注册所有组件,4.0已经废弃了。

avdevice_register_all():对设备进行注册。

avformat_network_init():处理话网络库以及网络协议相关的库(比如openssl)

3.封装格式相关

avformat_alloc_context():负责申请一个AVFormatContext结构的内存,并进行简单初始化。

avformat_free_context():释放该结构里的所有东西以及该结构本身。

avformat_close_input():关闭解复用器。关闭后就不再需要使用avformat_free_context 进行释放。

avformat_open_input():打开输入视频文件

avformat_find_stream_info():获取音视频文件信息

av_read_frame(): 读取音视频包

avformat_seek_file():定位文件

av_seek_frame():定位文件

复用器这块调用大体过程:

  • avformat_alloc_context(分配解复用器上下文)
  • avformat_open_input(根据url打开本地文件或网络流)
  • avformat_find_stream_info(读取媒体的部分数据包以获取码流信息)
  • av_read_frame:从文件中读取数据包
  • avformat_seek_file或av_seek_frame:定位文件
  • avformat_close_input:关闭解复用器

4.解码器相关

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_alloc_context3:分配解码器上下文
  • avcodec_parameters_to_context:将码流中的编解码器信息拷贝到AVCodecContex
  • avcodec_find_decoder或指定解码器avcodec_find_decoder_by_name:根据编解码器信息查找相应的解码器
  • avcodec_open2:打开编解码器并关联到AVCodecContex
  • avcodec_send_packet:向解码器发送数据包
  • avcodec_receive_frame:接收解码后的帧
  • avcodec_close avcodec_free_context:关闭解码器和释放上下文

5.组件注册

ffmpeg 3.x 需要主动调用av_register_all,4.x会自动进行注册,但是注册的流程类似。调用av_register_all,会把全局的编码器、解码器等结构体注册到各自全局的对象链表里,以便后边查找调用。

在这里插入图片描述

6.常用的结构体介绍

  • AVFormatContext:封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式等相关信息。

    • iformat:输入媒体的AVInputFormat,比如指向AVInputFormat ff_flv_demuxer
    • nb_streams:输入媒体的AVStream 个数,一般可以通过遍历这个来得到流信息,进而判断流的类型codec_type
    • streams:输入媒体的AVStream []数组,通过这个数组拿到流信息
    • duration:输入媒体的时长(以微秒为单位),计算方式可以参考**av_dump_format()**函数。
    • bit_rate:输入媒体的码率
  • AVInputFormat 对应demuxer ,每一种封装格式对应一个这样的结构体(例如FLV, MKV, MP4, AVI)。

    AVInputFormat ff_flv_demuxer = {
        .name           = "flv",
        .long_name      = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"),
        .priv_data_size = sizeof(FLVContext),
        .read_probe     = flv_probe,
        .read_header    = flv_read_header,
        .read_packet    = flv_read_packet,
        .read_seek      = flv_read_seek,
        .read_close     = flv_read_close,
        .extensions     = "flv",
        .priv_class     = &flv_class,
    };
    
    • name:封装格式名称
    • extensions:封装格式的扩展名
    • 一些封装格式处理的接口函数,比如read_packet()
  • AVOutputFormat 对应muxer

    AVOutputFormat ff_flv_muxer = {
        .name           = "flv",
        .long_name      = NULL_IF_CONFIG_SMALL("FLV (Flash Video)"),
        .mime_type      = "video/x-flv",
        .extensions     = "flv",
    }
    
  • AVStream:每个视频流或者音频流对应一个这样的结构体

    • index:标识该视频/音频流
    • time_base:该流的时基,PTS*time_base=真正的时间(秒)
    • avg_frame_rate:该流的帧率
    • duration:该视频/音频流长度
    • codecpar:编解码器参数属性
  • AVCodecParameters

    • codec_type:媒体类型,比如AVMEDIA_TYPE_VIDEO AVMEDIA_TYPE_AUDIO等
    • codec_id:编解码器类型,比如AV_CODEC_ID_H264 AV_CODEC_ID_AAC等。
  • AVCodecContext:编码器上下文保存了视频或者音频编解码相关的信息。

    • codec:编解码器的AVCodec,比如指向AVCodec ff_aac_latm_decoder
    • width, height:图像的宽高(只针对视频)
    • pix_fmt:像素格式(只针对视频)
    • sample_rate:采样率(只针对音频)
    • channels:声道数(只针对音频)
    • sample_fmt:采样格式(只针对音频)
  • AVCodec:每种视频或者音频编解码器对应一个这样的结构体。

    • name:编解码器名称
    • type:编解码器类型
    • id:编解码器ID
    • 一些编解码的接口函数,比如int (*decode)()
  • AVPacket:存储一帧这样的压缩数据。

    • pts:显示时间戳
    • dts:解码时间戳
    • data:压缩编码数据
    • size:压缩编码数据大小
    • pos:数据的偏移地址
    • stream_index:所属的AVStream
  • AVFrame:存储一帧解码或者采样数据。

    • data:解码后的图像像素数据(音频采样数据)
    • linesize:对视频来说是图像中一行像素的大小;对音频来说是整个音频帧的大小
    • width, height:图像的宽高(只针对视频)
    • key_frame:是否为关键帧(只针对视频)
    • pict_type:帧类型(只针对视频)。例如I,P,B
    • sample_rate:音频采样率(只针对音频)
    • nb_samples:音频每通道采样数(只针对音频)
    • pts:显示时间戳

7.AVFormatContext, AVStream和AVCodecContext之间的关系

在这里插入图片描述

通过遍历AVFormatContext中的streams,拿到AVStream,每一个AVStream对应一个流,流内部包好解码器相关的参数信息codecpar,通过avcodec_parameters_to_context将解码器相关的参数拷贝到AVCodecContext中去。

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

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

相关文章

ATTCK 01

官网环境链接 漏洞信息 下载好后自行解压 分别在VM中依次打开 配置攻击机和三个客户机的网络环境 其中攻击机选择 kali 客户机为 win7 win8 win2k3 kali的设置 (VMnet1) win7 的设置 (VMnet1用于连接外网 VMnet2用于连接内网) win8 …

滴滴前端一面高频vue面试题及答案

keep-alive 使用场景和原理 keep-alive 是 Vue 内置的一个组件, 可以实现组件缓存 ,当组件切换时不会对当前组件进行卸载。 一般结合路由和动态组件一起使用 ,用于缓存组件提供 include 和 exclude 属性, 允许组件有条件的进行缓…

数据交换格式

1、什么是数据交换格式 数据交换格式,就是服务器端与客户端之间进行数据传输与交换的格式。 前端领域,经常提及的两种数据交换格式分别是 XML 和 JSON。其中 XML 用的非常少,所以,我们重点要学习的数据交换格式就是 JSON。 2、XML…

数学建模学习笔记-算法(整数规划模型的基本概念)

目录 基本概念 定义 分类: 数学模型 分为 整数规划和松弛的线性规划的关系​编辑 基本概念 定义 数学规划中变量限制为整数时,称为整数规划 线性规划中变量限制为整数时,称为整数线性规划 分类: 变量全限制为整数时&#…

Adversarial Robustness vs. Model Compression, or Both?

众所周知,深度神经网络(DNN)容易受到对抗性攻击,这种攻击是通过在良性示例中添加精心设计的扰动来实现的。基于最小-最大鲁棒优化的对抗性训练可以提供对抗性攻击的安全概念。然而,对抗性鲁棒性需要比仅具有良性示例的…

二叉树的Morris遍历

Morris 遍历的是指就是避免用栈结构,而是让下层到上层有指针,具体时通过让底层节点指向 null 的空闲指针指回上层的某个节点,从而完成下层到上层的移动。 Morris 遍历的过程: 假设当前节点为cur,初始时cur就是整棵树的…

33-剑指 Offer 34. 二叉树中和为某一值的路径

题目给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。示例 1:输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22输出&#…

邮箱中的Qt线程设计

邮箱(deepin-mail)主要使用Qt框架开发,是一个有大量并行任务且需要监控进度和结果的项目,任务的优先级调整和支持取消回滚也是必不可少。Qt已经为我们提供了多种线程设计的方法,可以满足绝大部分使用场景,但…

钧瓷产业基础架构(SCA架构)是钧瓷产业发展的核心引擎

《钧瓷内参》独立客观,原创前瞻,深度评论,定期推送 钧 瓷 内 参 第3期(总第335期) 2023年1月3日 钧瓷产业数字化发展的下一个阶段——钧瓷共同体,是钧瓷产业数字化发展的必然趋势。 实现钧瓷共同体的路线…

JavaSE从基础到入门:String类的学习

前言 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。 1.String类的方法 1.字符串的构造方法 使用常量串构造 String s1 "hello world"; System.out.println(s1);直接newString对象…

【Linux】Linux基本权限

作者:一个喜欢猫咪的的程序员 专栏:《Linux》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 1.shell命令以及运行原理 2.Linux权限 2.1Linux权限的概念 2.2Linux上用户…

DALLE2-文本图像生成

文章目录摘要算法解码器prior图像处理变体插值文本差异限制论文: 《Hierarchical Text-Conditional Image Generation with CLIP Latents》github: https://github.com/lucidrains/DALLE2-pytorchhttps://github.com/LAION-AI/dalle2-laion摘要 CLIP已经…

window环境安装mysql8.0.12版本的安装、配置(详细步骤图解)

目录一、mysql官网下载网址二、下载步骤三、安装步骤四、测试链接一、mysql官网下载网址 mysql官网下载网址 https://www.mysql.com/ 二、下载步骤 浏览器输入https://www.mysql.com/网址,点击【DownLoads】,如下图: 向下滑动网页&#x…

软件测试面试注意事项汇总

面对最近的复工热潮,不少求职者也开始蠢蠢欲动准备找工作了。相信大家都知道疫情下面试求职的压力是有史以来最大的,我们唯一能做好的只有积极的准备面试,让自己可以更加从容的面对的面试官的提问。下面小编为大家汇总了软件测试面试过程中的…

CSDN官方猿如意工具体验

2022年注定是不平凡的一年,2022再见,2023你好! 2023愿我们发财,被爱,一路好运常在!愿所念之人平安喜乐,所想之事顺心如意,岁岁常欢喜,万事皆胜意! 猿如意工具…

中间件:Win10安装运行Kafka

一、JDK环境安装配置 可参考:百度安全验证 二、Zookeeper安装配置 1、下载 : Index of /dist/zookeeper/zookeeper-3.4.9 2、解压到本地,目录不要带中文符号,保证纯英文 3、zoo.cfg修改 4、cmd运行,使用命令zkServe…

ConcurrentHashMap 线程安全

JDK1.7 结构 数据结构是数组segment对象,采用segment分段锁和CAS保证并发。 加锁 JDK1.7中的ConcurrentHashMap是由 segment数组结构和 HashEntry 数组结构组成,即 ConcurrentHashMap把哈希桶切分成小数组(Segment ),每个Segment 有n个 Hash…

终于!Linaro 加盟 Zephyr 项目

导读为物联网构建实时操作系统的开源协作项目 Zephyr 项目宣布,Linaro 有限责任公司以白金会员的身份加盟该项目。Linaro是一家为 ARM 架构开发开源软件的协作工程组织,也是全球性机构,其 35 个成员中不乏来自多个行业部门的龙头企业。Linaro…

嵌入式实时操作系统的设计与开发(一)

以一款简单、易学的嵌入式开发平台ARM Mini2440(CPU是三星ARM 9系列的ARM S3C2440)为例,通过具体代码实现,介绍如何从裸板入手设计简单的轮询系统、前后台系统,以及如何一步一步在ARM Mini2440上编写RTOS内核&#xff…

Spring之配置非自定义Bean

目录 一:概述 二:代码演示 1)配置Druid数据源交由Spring管理 一:概述 以上在xml中配置的Bean都是自己定义的, 例如:UserDaolmpl, UserServicelmpl。但是, 在实际开发中有些 功能类并不是我们…