C/C++音视频高级开发 FFmpeg编程入门

2023-05-16

1、播放器框架

1.1常用音视频术语

  • 容器/文件(Conainer/File):即特定格式的多媒体文件,比如mp4、flv、mkv等。

  • 媒体流(Stream):表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字幕数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器(有些码流音频他是纯PCM)。

  • 数据帧/数据包(Frame/Packet):通常,一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储于容器之中。

  • 编解码器:编解码器是以帧为单位实现压缩数据和原始数据之间的相互转换的。

2、常用概念

  • 复用器

  • 编解码器

3、FFmpeg库简介

FFMPEG有8个常用库:

  • AVUtil:核心工具库,下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。

  • AVFormat:文件格式和协议库,该模块是最重要的模块之一,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于开发者来说是透明的。

  • AVCodec:编解码库,封装了Codec层,但是有一些Codec是具备自己的License的,FFmpeg是不会默认添加像libx264、FDK-AAC等库的,但是FFmpeg就像一个平台一样,可以将其他的第三方的Codec以插件的方式添加进来,然后为开发者提供统一的接口。

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

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

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

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

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

  • av_register_all():注册所有组件,4.0已经弃用

  • avdevice_register_all()对设备进行注册,比如V4L2等。

  • avformat_network_init();初始化网络库以及网络加密协议相关的库(比如openssl)

封装格式相关

  • 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():定位文件

解码器相关

  • avcodec_alloc_context3(): 分配解码器上下文

  • avcodec_find_decoder():根据ID查找解码器

  • avcodec_find_decoder_by_name():根据解码器名字

  • avcodec_open2(): 打开编解码器

  • avcodec_decode_video2():解码一帧视频数据

  • avcodec_decode_audio4():解码一帧音频数据

  • avcodec_send_packet(): 发送编码数据包

  • avcodec_receive_frame(): 接收解码后数据

  • avcodec_free_context():释放解码器上下文,包含了avcodec_close()

  • avcodec_close():关闭解码器

FFmpeg3.x组件注册方式

我们使用ffmpeg,首先要执行av_register_all,把全局的解码器、编码器等结构体注册到各自全局的对象链表里,以便后面查找调用。

FFmpeg4.x组件注册方式

FFmpeg4.0.2组件注册方式

4、FFmpeg常用结构体简介

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

  • AVInputFormat demuxer 每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。

  • AVOutputFormat muxer

  • AVStream 视频文件中每个视频(音频)流对应一个该结构体。

  • AVCodecContext 编解码器上下文结构体,保存了视频(音频)编解码相关信息。

  • AVCodec 每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。

  • AVPacket 存储一帧压缩编码数据。

  • AVFrame 存储一帧解码后像素(采样)数据。

4.1FFmpeg数据结构之间的关系

AVFormatContext和AVInputFormat之间的关系

  • AVFormatContext API调用

  • AVInputFormat 主要是FFMPEG内部调用


AVFormatContext 封装格式上下文结构体
struct AVInputFormat *iformat;
复制代码
AVInputFormat 每种封装格式(例如FLV, MKV, MP4)
int (*read_header)(struct AVFormatContext * );
int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
复制代码
int avformat_open_input(AVFormatContext **ps, const char *filename,AVInputFormat *fmt, AVDictionary **options)
复制代码  

AVCodecContext和AVCodec之间的关系


AVCodecContext 编码器上下文结构体
struct AVCodec *codec;
复制代码
AVCodec 每种视频(音频)编解码器
int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, 
AVPacket *avpkt);
int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr);
复制代码  

4.2区分不同的码流


AVMEDIA_TYPE_VIDEO视频流
video_index = av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO, -1,-1, NULL, 0)
复制代码
- AVMEDIA_TYPE_AUDIO音频流
audio_index = av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO, -1,-1, NULL, 0)
复制代码  

AVPacket 里面也有一个index的字段

4.3数据结构分析

AVFormatContext

  • iformat:输入媒体的AVInputFormat,比如指向AVInputFormat ff_flv_demuxer

  • nb_streams:输入媒体的AVStream 个数

  • streams:输入媒体的AVStream []数组

  • duration:输入媒体的时长(以微秒为单位),计算方式可以参考av_dump_format()函数。

  • bit_rate:输入媒体的码率

AVInputFormat

  • name:封装格式名称

  • extensions:封装格式的扩展名

  • id:封装格式ID

  • 一些封装格式处理的接口函数,比如read_packet()

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)()

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:显示时间戳

原文链接:C/C++音视频高级开发 FFmpeg编程入门 - 掘金

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++音视频高级开发 FFmpeg编程入门 的相关文章

  • 用轻量服务器搭建自己的pdf在线工具箱(支持pdf压缩以及pdf OCR)

    上篇文章中我们讲了怎么利用腾讯轻量云服务器搭建一个PDF在线压缩工具 xff0c 今天我们来搭建一个更强大的工具 xff0c 不仅支持PDF在线压缩 xff0c 还支持PDF OCR文字识别 前言 前两天需要压缩一个pdf文件 xff0c
  • 用轻量服务器搭建imgproxy来获取不同尺寸的图片

    现在很多站长都喜欢搭建一个自己的私有图床来管理图片 xff0c 使用的一般都是第三方的开源图床程序 有时候可能第三方的图床程序不能完全满足我们的需要 xff0c 比如说 xff0c 我们上传了一张图片以后 xff0c 在不同的页面下 xff
  • 在轻量服务器上使用NextList搭建OneDriver列表程序

    什么是列表程序 xff1f 我们平时都会使用各种各样的网盘程序来把我们的文件保存到互联网上 xff0c 然后在需要的时候再从网盘中下载文件 一般情况下 xff0c 浏览文件列表以及下载文件都必须先登录网盘账号 xff0c 如果我们想要把文件
  • 良心云最近活动是真多啊,一波接一波,大伙有需要的上车

    1 轻量云2核免费升配4核 直接去控制台选择248套餐升级就行 xff0c 有这个配置的可以去操作一下 xff0c 截止到这个月底 我已经升了 附上轻量控制台链接 xff1a https console cloud tencent com
  • beego打包在windows上闪退

    打包拿到其他windows机器上运行 xff0c 直接闪退无法正常运行 没办法 xff0c 在cmd下运行可执行文件 发现又以下报错 xff1a ORM 2020 09 11 14 29 12 register db Ping 96 def
  • Debian11.3配置SSH允许root用户远程登录系统

    系统版本 root 64 localhost cat etc os release PRETTY NAME 61 34 Debian GNU Linux 11 bullseye 34 NAME 61 34 Debian GNU Linux
  • Shell 脚本常用命令

    Shell 脚本的概念 将平时使用的各种Linux命令按顺序保存 xff08 堆叠 xff09 到一个文本文件中 xff0c 添加上执行权限 xff0c 就是一个Shell脚本 将要执行的命令按先后顺序保存到一个文本文件 给该文件可执行权限
  • 来,看看记事本里会变成乱码的字……不仅仅是“联通”而已……

    众所周知 xff0c 联通 这两个字直接默认保存到记事本里会出现乱码 xff0c 变成小黑块 具体原因网上解释很多 xff0c 总结起来就一句话 xff1a 联通 的内码是0xC1 1100 0001 0xAA 1010 1010 0xCD
  • Python读取Word表格数据

    import docx from docx import Document 导入库 path 61 34 E python data 1234 docx 34 文件路径 document 61 Document path 读入文件 tabl
  • Python:下载和安装Pygame

    1 下载Pygame包 注意 xff1a 根据Python版本和Windows系统的位数选择要对应版本的Pygame包 官网地址 xff1a http www pygame org download shtml 其中 xff0c 如果Pyt
  • python 编写input和output函数,输出学生信息

    题目 xff1a 编写input 和output 函数输入 xff0c 输出5个学生的数据记录 解释 xff1a 可以通过函数的方式实现 xff0c 也可以用类的方式实现 xff0c 下面举例用类的方法实现 xff1a span class
  • python 调整行和列

    在 Excel 中 xff0c 调整行和列的大小非常容易 xff0c 只要点击并拖动行的边缘 xff0c 或列的 头部 但如果你需要根据单元格的内容来设置行或列的大小 xff0c 或者希望设置大量电 子表格文件中的行列大小 xff0c 编写
  • Word 文件转换为 markdown

    本文主要介绍在Ubuntu系统下面如何将 word 文件转换为 markdown 文件 第一步 xff1a 安装 unoconv 和 pandoc su span class operator span class keyword styl
  • VS2013平台搭建——关于无法打开“kernel32.lib”和无法运行“rc.exe”的解决方法

    背景 xff1a 由于项目需要 xff0c 必须使用VS2013作为开发平台 由于以前一直使用的是VS2010 xff0c 平台搭建时傻瓜式下一步到底就完成了 xff0c 这次遇到了点小困难 xff0c 找了点资料解决了 留个记录 xff0
  • iOS autolayout自适应cell高度时使用estimatedRowHeight的一些问题

    estimatedRowHeight是一个预估高度 xff0c 再iOS11之前默认是0 xff0c 也就是默认关闭 xff0c 在iOS11下 xff0c 默认44 再iOS11下也可以让estimatedRowHeight 61 0来关
  • 解决关闭deepin 15.11“自动索引内置磁盘”后仍然卡顿的问题

    关闭文件管理器中 自动索引内置磁盘 后 xff0c 查看iotop xff0c 已经没有占用磁盘的程序 xff0c 然而系统仍然卡顿 由于使用过程中听到磁盘频繁休眠 启动 xff1b 并且系统使用中卡死 以及待机后启动并卡死 xff0c 强
  • 打牌(求牌型方案数)

    问题描述 有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 xff09 和一个花色 xff08 整数 xff0c 记为b xff0c 范围区间是 0 到 B 1 扑克牌是互异的 x
  • 滑动窗口【区间最大值区间&最小值】【单调队列】

    问题描述 ZJM 有一个长度为 n 的数列和一个大小为 k 的窗口 窗口可以在数列上来回移动 现在 ZJM 想知道在窗口从左往右滑的时候 xff0c 每次窗口内数的最大值和最小值分别是多少 例如 xff1a 数列是 1 3 1 3 5 3
  • Q老师的考验【矩阵快速幂】【斐波那契数列】

    问题描述 Q老师 对数列有一种非同一般的热爱 xff0c 尤其是优美的斐波那契数列 这一天 xff0c Q老师 为了增强大家对于斐波那契数列的理解 xff0c 决定在斐波那契的基础上创建一个新的数列 f x 来考一考大家 数列 f x 定义
  • Q老师度假【动态规划dp】【矩阵快速幂优化】

    问题描述 忙碌了一个学期的 Q老师 决定奖励自己 N 天假期 假期中不同的穿衣方式会有不同的快乐值 已知 Q老师 一共有 M 件衬衫 xff0c 且如果昨天穿的是衬衫 A xff0c 今天穿的是衬衫 B xff0c 则 Q老师 今天可以获得

随机推荐

  • 插值算法[数学建模]

    插值 插值算法一维数据插值方法分段线性插值分段二次插值 xff08 分段抛物插值 xff09 拉格朗日插值法龙格现象 牛顿插值法埃尔米特插值法分段三次埃尔米特插值PCHIP 样条插值三次样条插值 n维数据插值应用 插值算法 在工程和数学应用
  • 时间序列【数学建模】

    时间序列 确定性时间序列分析方法移动平均法简单移动平均法加权移动平均法趋势移动平均法 指数平滑法一次指数平滑法二次指数平滑法三次指数平滑法 差分指数平滑法一阶差分指数平滑法二阶差分指数平滑法 具有季节性特点的时间序列的预测 平稳时间序列模型
  • UITabBarController的简单使用和属性方法总结

    一 引言 与导航控制器相类似 xff0c 标签控制器也是用于管理视图控制器的一个UI控件 xff0c 在其内部封装了一个标签栏 xff0c 与导航不同的是 xff0c 导航的管理方式是纵向的 xff0c 采用push与pop切换控制器 xf
  • 多元分析——聚类分析【数学建模】

    聚类分析 Q型聚类分析样本的相似性度量类与类间的相似性度量聚类图最短距离法的聚类举例Matlab 聚类分析的相关命令pdistlinkageclusterzsore X H 61 dendrogram Z P T 61 clusterdat
  • 多元分析——主成分分析【数学建模】

    主成分分析的主要目的是希望用较少的变量去解释原来资料中的大部分变异 xff0c 将许多相关性较高的变量转化为彼此相互独立或不相关的变量 通常是选出的比原始变量个数少 xff0c 能解释大部份资料中的变异的几个新变量 xff0c 即所谓主成分
  • Pytorch Resnet101

    Pytorch Resnet101 模型使用模板 模型 span class token string 34 34 span 34 model span class token operator span span class token
  • t-SNE可视化

    t SNE的全称是t Distributed Stochastic Neighbor Embedding xff0c 是一种降低维度的技术 xff0c 适用于将高维度数据可视化 它将数据点之间的相似性转换为联合概率 xff0c 并试图最小化
  • ubuntu下为apt-get设置代理

    debian mint都可以按此设置 xff08 debian系均可 xff0c 直接基于debian或间接基于debian的 xff09 现在公司很多都是通过代理上网的 xff0c 通过代理上网apt get install无法通网络进行
  • 开源虚拟化集群管理平台ProxmoxVE-安装介绍以及PCI直通和嵌套虚拟化说明

    说明 xff1a 当前测试环境为PVE7 0版本 官网 xff1a Proxmox Powerful open source server solutions 目录 背景 安装系统 PCI直通配置 xff08 开启iommu xff09 允
  • qt Linux arm 交叉编译

    1 操作系统 ubuntu1 20 04 2 qt5 9 9 Index of archive qt 5 9 5 9 9 下载qt源码 qt everywhere opensource src 5 9 9 tar xz 和程序 qt ope
  • 三角函数:图像和性质关系

    紧接上一篇 xff1a http blog csdn net yinhun2012 article details 79377728 这次我们通过函数图文和unity程序来观察三角函数的图像 xff0c 首先从基本的来 xff1a 1 f
  • Linux 每天定时关机 设置

    sudo gedit etc crontab 输入密码后 xff0c 在该文件插入一行 50 02 root sbin shutdown h now 保存后 xff0c 系统会在每天02 50 自动关机
  • anaconda如何配置环境变量

    anaconda安装好后 xff0c 在cmd输入conda xff0c 显示 xff1a conda 不是内部或外部命令 xff0c 也不是可运行的程序 或批处理文件 原因是 xff1a anaconda没有配置环境变量 那接下来我就教大
  • Windows下用 Code blocks + mingw 搭建 Fortran 编译环境

    方法一 xff1a 下载页面 xff1a http www codeblocks org downloads binaries 下载 codeblocks 17 12mingw fortran setup exe 这样的版本 方法二 xff
  • 音频编码格式介绍-AAC

    目录 概述 帧格式 算法简介 开源的软件 AAC和MP3的关键性不同 参考阅读 1 概述 AAC xff08 Advanced Audio Coding xff09 xff0c 被认为是MP3的继任者 xff0c 相对MP3有更高的压缩效率
  • FFmpeg入门 - 视频播放

    音视频最好从能够直接看到东西 也更加贴近用户的播放开始学起 音视频编解码基础 我们可以通过http rtmp或者本地的视频文件去播放视频 这里的 34 视频 34 实际上指的是mp4 avi这种既有音频也有视频的文件格式 这样的视频文件可能
  • FFmpeg入门 - 格式转换

    1 音频分 plane 与打包 packed 解码出来的AVFrame 它的data字段放的是视频像素数据或者音频的PCM裸流数据 linesize字段放的是对齐后的画面行长度或者音频的分片长度 For video size in byte
  • ffmpeg播放器实现详解 - 音频播放

    1 生产者 消费者线程模型 本文主要讨论posix标准下的生产者 消费者线程模型 xff0c posix标准多用于类linux相关环境 POSIX The Portable Operating System Interface POSIX
  • 史上最全的WebRTC服务器技术选型分析

    1 前言 所以最常见的办法就是使用开源的实现 但是这里我也想给大家说一定 xff0c 用了开源的解决方案 xff0c 能快速的搭建起业务 xff0c 但是无疑也欠下了技术债 xff0c 因为开源的解决方案肯定没有自己实现的要熟悉 xff0c
  • C/C++音视频高级开发 FFmpeg编程入门

    1 播放器框架 1 1常用音视频术语 容器 xff0f 文件 xff08 Conainer File xff09 xff1a 即特定格式的多媒体文件 xff0c 比如mp4 flv mkv等 媒体流 xff08 Stream xff09 x