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编程入门 的相关文章

  • 从0开始跑通VINS FUSION(KITTI数据集)

    背景 xff1a VINS FUSION是香港科技大学在VINS MONO后做的推出的多功能版 xff0c 有双目的数据 xff0c 还有和GPS的融合 作为一个SLAM小白 xff0c 记录一下整个的跑通过程 代码连接 xff1a htt
  • ubuntu关于aptitude和apt-get

    起初GNU Linux系统中只有 tar gz 用户 必须自己编译他们想使用的每一个程序 在Debian出现之後 xff0c 人们认为有必要在系统 中添加一种机 制用来管理 安装在计算机上的软件包 人们将这套系统称为dpkg 至此着名的 p
  • C语言链表的简单编写

    代码分为3个部分 xff0c test c head h list c list c封装的函数 include 34 head h 34 创建一个空链表 Linklist list creat 申请一断空间 Linklist L L 61
  • java中a=a++;a=a+1;a+=1执行过程分析

    本文章内容前提是a数据类型为int 当a数据类型为int时 xff0c 执行a 61 a 43 43 后 xff0c a的数值不会变 xff1b 执行a 61 a 43 1后 xff0c 数值加1 xff1b 执行a 43 61 1后 xf
  • 【VPN(虚拟专用网)攻略大全】

    在 VPN 出现之前 xff0c 企业分支之间的数据传输只能依靠现有物理网络 xff08 例如 Internet xff09 由于 Internet 中存在多种不安全因素 xff0c 报文容易被网络中的黑客窃取或篡改 xff0c 最终造成数
  • Linux 如何检测硬盘坏道?

    在 Mac 和 Windows 下检测硬盘坏道有专门的工具 xff0c 或自带 或三方的都挺好用 xff0c 但是如何在 Linux 下检测硬盘坏道呢 xff1f 首先 xff0c 用 lsblk 命令查看下待检测硬盘的名字 xff1a 然
  • 图论-路径优化算法总结

    知乎主页 https www zhihu com people shuang shou cha dai 53 目录 1 xff1a Dijkstra算法 1 1 xff1a 算法思想 1 2 xff1a 算法步骤 1 3 xff1a 代码演
  • uORB发布订阅实例

    PX4SITL仿真 uORB实例 飞控串口读取外部传感器数据 xff1a 飞控开启一个进程读取外部传感器数据 xff0c 发布一个uORB主题 xff1b 另一个进程订阅前一个进程发布的主题 xff0c 订阅到的主题通过mavlink消息发
  • PX4仿真环境搭建

    PX4 SITL Simulation 前提准备 xff1a Ubuntu16 04 LTS 安装ROS kinetic 题外话 xff1a 如果连的是有IPV6的校园网 xff0c 在update时可能会访问IPV6地址出错 xff0c
  • PX4-Gazebo仿真学习笔记

    PX4 Gazebo仿真 xff1a http bbs amovauto com forum php mod 61 viewthread amp tid 61 486 amp extra 61 page 3D1 Simulator仿真器 x
  • C语言strtok函数

    1 strtok 语法 include lt string h gt char strtok char str const char delimiters 参数 xff1a str xff0c 待分割的字符串 xff08 c string
  • 终于把大数据类产品全流程解释清楚了

    你点开这文章 xff0c 说明你清晰知道了数据才是一切的基础 人工智能 机器学习 大数据等应用的基础都是基于这样的一个流程 xff0c 只是说运用领域不同 xff0c 那么偏重点不同 本文从数据采集到数据报告 xff0c 详细说明了大数据运
  • 关于slam

    什么是SLAM 机器人在未知环境中 xff0c 要实现智能化需要完成三个任务 xff0c 第一个是定位 Localization xff0c 第二个是建图 Mapping xff0c 第三个则是随后的路径规划 Navigation 之前地平
  • Linux(Ubuntu系统)同网段SSH连接不上,网络能ping通

    问题描述 测试以下命令同样连接不上 span class token function ssh span localhost 问题原因 Ubuntu系统自带 openssh client xff0c 但是没有自带 openssh serve
  • 本地进程间通信(二)--套接字socket

    目录 一 什么是Socket xff1f 二 socket通信流程 Server端 一 创建socket 二 命名socket 三 绑定 四 监听 五 关闭 Client端 一 创建socket 二 connect 三 发送数据 四 关闭s
  • debain服务器搭建之虚拟机安装(一)

    debain服务器虚拟机搭建系列 xff08 一 xff09 xff08 一 xff09 下载debain系统 xff08 二 xff09 搜索下载安装 vmware xff08 三 xff09 开始安装debain系统 xff08 四 x
  • 企业私有云技术设计方案

    1 概述 1 1 文档内容 本文档为某企业私有云技术路线设计文档 1 2 背景描述 1 2 1 某企业私有云业务线规划 近些年由于国内IDC市场发展迅速 xff0c 某企业从战略层面考虑 xff0c 建造了自己的高等级数据中心 xff0c
  • Qt的主窗口背景设置

    主界面设置背景一般有设置背景图片和背景颜色的需求 xff0c 其实二者之间设置方法类似 目录 主界面设置背景一般有设置背景图片和背景颜色的需求 xff0c 其实二者之间设置方法类似 方法一 xff1a 最简单的方式是通过ui界面来设置 xf
  • 7.使用码云

    使用GitHub时 xff0c 国内的用户经常遇到的问题是访问速度太慢 xff0c 有时候还会出现无法连接的情况 xff08 原因你懂的 xff09 如果我们希望体验Git飞一般的速度 xff0c 可以使用国内的Git托管服务 码云 xff
  • git diff命令之后,如何退出

    git diff命令是对比两次文件修改了什么 但如何退出呢 xff1f 输入q 按enter键盘

随机推荐

  • Float类型出现舍入误差的原因

    首先是float累加产生误差的原因 xff0c 该部分转自 xff1a http blog csdn net zhrh0096 article details 38589067 1 浮点数IEEE 754表示方法 要搞清楚float累加为什
  • React之antd Form回显数据

    转自 xff1a https blog csdn net welkin qing article details 110004969 文章目录 一 antd4如何回显数据 1 定义变量2 保存接口数据到form变量中3 form显示数据4
  • equals()方法和hashCode()方法

    1 hashCode 简介 该方法主要是利用一定的规则生成对象的哈希码 xff0c 也称散列码 它是是由对象导出的一个整数值 xff0c 是没有规律的 关于hashCode 使用的哈希算法 xff0c 越糟糕的哈希算法越容易产生哈希碰撞 产
  • 手把手教你基于STM32的BootLoader的OTA远程升级

    本文系21ic论坛蓝V作者小叶三千原创撰写 上次发过SD卡的Bootloader离线升级后 xff0c 应大家的要求 xff0c 这次就讲一下STM32的OTA远程升级 OTA又叫空中下载技术 xff0c 是通过移动通信的空中接口实现对移动
  • 转知乎,感觉非常棒,适合普通人c++学习路线图

    作者 xff1a 刘凯新 链接 xff1a https www zhihu com question 23447320 answer 39322848 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业
  • InfluxDB和IotDB介绍与性能对比

    InfluxDB简介 InfluxDB 是用Go语言编写的一个开源分布式时序 事件和指标数据库 xff0c 无需外部依赖 用于存储和分析时间序列数据的开源数据库 适合存储设备性能 日志 物联网传感器等带时间戳的数据 其设计目标是实现分布式和
  • CVSNT SERVER Configuration

    title CVSNT SERVER Configuration 64 author H819 64 version 0 5 Copyright free reference note author name and the article
  • JavaScript高级使用(对象、BOM、封装)

    JavaScript高级 今天给大家介绍以下几个内容 xff1a JavaScript 面向对象JavaScript 内置对象JavaScript BOMJavaScript 封装 JavaScript面向对象 其实JavaScript中的
  • Python函数(函数定义、函数调用)用法详解

    Python 中 xff0c 函数的应用非常广泛 xff0c 前面章节中我们已经接触过多个函数 xff0c 比如 input print range len 函数等等 xff0c 这些都是 Python 的内置函数 xff0c 可以直接使用
  • zsh配置

    原本用WindTerm 43 bash xff0c WindTerm提供了高亮 自动记忆补全等功能 xff0c 基本上也够用 WindTerm还是比较早期阶段 xff0c 功能细节上还有待完善 xff0c 稳定性方面也有些小问题 比如用vi
  • Android CHRE (Context Hub Runtime Environment)简介

    当前的ARM处理的多个核心 xff0c Android系统运行在速度最快的大核上 xff0c 通常叫AP xff08 Application Processor xff09 AP主要为性能 体验优化 xff0c 相对来说能耗高 处理器中还有
  • Docker pull 命令

    Docker pull 命令 Docker 命令大全 docker pull 从镜像仓库中拉取或者更新指定镜像 语法 docker pull OPTIONS NAME TAG 64 DIGEST OPTIONS说明 xff1a a 拉取所有
  • strrchr函数的实现

    lt span style 61 34 font size 18px 34 gt include lt stdio h gt include lt string h gt char strrchr char const s1 int ch
  • UCOSIII概述

    又给自己挖了一个小坑 xff0c 今天开始学习UCOS xff0c 本篇文章只是作为学习笔记 xff0c 并不是什么教程 文章目录 序言源码概览配置文件UCOSIII与移植相关代码文件UCOS与CPU相关代码文件UCOSIII库文件UCOS
  • UCOSIII中的消息传递

    文章目录 序言什么是消息队列消息队列相关函数OSQCreate OSQPend OSQPost 消息队列实验总结 序言 前面我们介绍了信号量 xff0c 通过信号量我们能够解决优先级反转 xff0c 资源共享冲突等问题 xff0c 但是我们
  • Qt之可视化QSS生成器(初探)

    简述 QSS是Qt的样式表 xff0c 类似于CSS xff0c 目前主要支持CSS2 写代码调样式非常不直观 xff0c 因此需要一个所见即所得的可视化样式生成器 xff0c 网上有很多CSS样式生成器 xff0c 最适合网页开发人员的1
  • 【秒懂音视频开发】26_RTMP服务器搭建

    流媒体 基本概念 流媒体 xff08 Streaming media xff09 xff0c 也叫做 xff1a 流式媒体 是指将一连串的多媒体数据压缩后 xff0c 经过互联网分段发送数据 xff0c 在互联网上即时传输影音以供观赏的一种
  • 论文笔记之PPDM(Parallel Point Detection and Matching for Real-time Human-Object Interaction Detection)

    分为两分支 xff0c 一个用于点 xff08 人 物 交互三个点 xff09 检测 xff0c 一个用于点匹配 xff0c 达到了实时的效果 CVPR2020接收 论文地址 xff1a https arxiv org pdf 1912 1
  • FFmpeg入门 - rtmp推流

    FFmpeg入门 视频播放 音视频开发老马的博客 CSDN博客介绍了怎样用ffmpeg去播放视频 里面用于打开视频流的avformat open input函数除了打开本地视频之外 实际上也能打开rtmp协议的远程视频 实现拉流 demo
  • C/C++音视频高级开发 FFmpeg编程入门

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