FFMpeg 实现视频编码、解码

article/2025/10/15 20:28:08

FFMpeg 作为音视频领域的开源工具,它几乎可以实现所有针对音视频的处理,本文主要利用 FFMpeg 官方提供的 SDK 实现音视频最简单的几个实例:编码、解码、封装、解封装、转码、缩放以及添加水印。

接下来会由发现问题->分析问题->解决问题->实现方案,循序渐进的完成。

FFMpeg 编码实现

本例子实现的是将视频域 YUV 数据编码为压缩域的帧数据,编码格式包含了 H.264/H.265/MPEG1/MPEG2 四种 CODEC 类型。

实现的过程,可以大致用如下图表示:

从图中可以大致看出视频编码的流程:

  • 首先要有未压缩的 YUV 原始数据。

  • 其次要根据想要编码的格式选择特定的编码器。

  • 最后编码器的输出即为编码后的视频帧。

根据流程可以推倒出大致的代码实现:

  • 存放待压缩的 YUV 原始数据。此时可以利用 FFMpeg 提供的 AVFrame 结构体,并根据 YUV 数据来填充 AVFrame 结构的视频宽高、像素格式;根据视频宽高、像素格式可以分配存放数据的内存大小,以及字节对齐情况。

  • 获取编码器。利用想要压缩的格式,比如 H.264/H.265/MPEG1/MPEG2 等,来获取注册的编解码器,编解码器在 FFMpeg 中用 AVCodec 结构体表示,对于编解码器,肯定要对其进行配置,包括待压缩视频的宽高、像素格式、比特率等等信息,这些信息,FFMpeg 提供了一个专门的结构体 AVCodecContext 结构体。

  • 存放编码后压缩域的视频帧。FFMpeg 中用来存放压缩编码数据相关信息的结构体为 AVPacket。最后将 AVPacket 存储的压缩数据写入文件即可。

AVFrame 结构体的分配使用av_frame_alloc()函数,该函数会对 AVFrame 结构体的某些字段设置默认值,它会返回一个指向 AVFrame 的指针或 NULL指针(失败)。

AVFrame 结构体的释放只能通过av_frame_free()来完成。

注意,该函数只能分配 AVFrame 结构体本身,不能分配它的 data buffers 字段指向的内容,该字段的指向要根据视频的宽高、像素格式信息手动分配,本例使用的是av_image_alloc()函数。

代码实现大致如下:

//allocate AVFrame struct
AVFrame *frame = NULL;
frame = av_frame_alloc();
if(!frame){printf("Alloc Frame Fail\n");return -1;
}//fill AVFrame struct fields
frame->width = width;
frame->height = height;
frame->pix_fmt = AV_PIX_FMT_YUV420P;//allocate AVFrame data buffers field point
ret = av_image_alloc(frame->data, frame->linesize, frame->width, frame->height, frame->pix_fmt, 32);
if(ret < 0){printf("Alloc Fail\n");return -1;
}//write input file data to frame->data buffer
fread(frame->data[0], 1, frame->width*frame->height, pInput_File);
...
av_frame_free(frame);

编解码器相关的 AVCodec 结构体的分配使用avcodec_find_encoder(enum AVCodecID id)完成,该函数的作用是找到一个与 AVCodecID 匹配的已注册过得编码器;成功则返回一个指向 AVCodec ID 的指针,失败返回 NULL 指针。

该函数的作用是确定系统中是否有该编码器,只是能够使用编码器进行特定格式编码的最基本的条件,要想


http://chatgpt.dhexx.cn/article/M2SmPshs.shtml

相关文章

感知视频编码

感知视频编码就是在视频编码的过程中&#xff0c;将HVS应用进去&#xff0c;挖掘主观视频感知冗余&#xff0c;进一步提高视频编码压缩效率。 1.Computational visual perception:三种视觉感知计算模型 &#xff08;1&#xff09;视觉敏感模型 &#xff08;2&#xff09;视觉注…

Android视频编码的坑

视频开发是一个核心方向&#xff0c;那Camera开发一直是Android的一个核心&#xff0c;笔者做过Camera HAL&#xff0c;也做过Camera App, 同时也开发过Camera 滤镜&#xff0c;这个过程中也遇到和解决过很多棘手的问题&#xff0c;也一直想总结一篇&#xff0c;看到这篇后感觉…

视频编码未来简史

首先我们回顾一下视频编码的历史&#xff0c;视频编码起源于广播电视&#xff0c;在很长一段时间里视频编解码的变革主要推动力是来自于广播电视。当然&#xff0c;今天我们看互联网的视频编码是速度越来越快&#xff0c;昨天在ICET2017年世界大会上&#xff0c;ICET的主席还说…

PCS2021:针对游戏内容的视频编码工具分析和数据集

本文来自PCS2021论文《Video Coding Tool Analysis and Dataset for Gaming Content》 随着近几年游戏市场的逐渐壮大&#xff0c;新的游戏形态&#xff08;AR、VR、云游戏等&#xff09;逐渐发展。和传统的摄像机内容和屏幕内容相比&#xff0c;游戏内容有着不同的特点导致对于…

视频编码综述

你用手机、电脑看电影追剧时&#xff0c;是看的高清还是标清&#xff1f;我想只要网速够得上应该没有人愿意再看标清了吧&#xff01;毕竟高清视频的高分辨率和清晰画质总是能让人有更好的观影体验。 伴随着用户对高清视频的需求量的增加&#xff0c;视频多媒体的视频数据量也在…

混合视频编码方法

参考文献&#xff1a; IP网络视频传输&#xff1a;技术、标准和应用 朱秀昌&#xff0c;唐贵进。--北京&#xff1a;人民邮电出版社&#xff0c;2017.9 预测编码和变换编码是混合编码的基础&#xff0c;当然除此之外还有运动估计、运动补偿、量化、熵编码、去方块滤波等。下面…

【视频编解码-02】视频编码的目的、条件和目标

视频编码&#xff0c;是视频处理中的一个核心技术。 现代我们所看到的所有视频&#xff0c;包括电视、互联网、手机等等&#xff0c;几乎所有的视频都会被编码、解码。 整个视频技术的基本流程是&#xff1a;视频数据的采集、视频数据的编码、视频数据的传输、视频数据的解码、…

【视频】视频文件格式和视频编码

我们经常在电脑、电视、手机或者其他终端产品看视频&#xff0c;我们对视频有个大概了解&#xff0c;比如清晰度、大小、视频类型等&#xff0c;但是对于视频内部结构我们应该一无所知&#xff0c;现在我们来一步一步解开视频的神秘面纱。 首先大家要清楚两个概念&#xff0c;视…

H.265视频编码原理总结

H.265视频编码原理总结 转载地址 1 概述 H.265&#xff08;HEVC High Efficiency Video Coding&#xff09;是现行H.264标准于2003年实现标准化以来时隔10年推出的新标准&#xff0c;将成为支撑未来十年的影像服务和产品的视频压缩技术。其特点是&#xff0c;支持1080p以上的…

视频编码流程详解

1、视频编码整体流程 2、FFmpeg视频编码详细流程 从本地读取YUV数据编码为H264格式的数据&#xff0c;然后再存入到本地&#xff0c;编码后的数据有带startcode。 与FFmpeg示例音频编码的流程基本一致。 3、关键函数说明 &#xff08;1&#xff09;avcodec_find_encoder_by_n…

视频编码知识

记录一下学习视频编码的过程和自己的理解 视频 数字图像在计算机中的表示&#xff1a;二维矩阵&#xff0c;或三维矩阵&#xff08;彩色&#xff09;。 矩阵中的每个点为像素&#xff0c;数值的大小反应色彩的强度&#xff0c;颜色深度需要使用一定数据空间存储&#xff0c;每…

视频的专业基础知识(一)常用的编码格式和参数

1. 常用的编码格式 编码格式&#xff1a;一个视频文件本身&#xff0c;通常由音频和视频两部分组成。例如视频文件&#xff0c;就是由avc视频编码AAC音频编码组成的&#xff0c;常见的视频编码格式有Xvid&#xff0c;AVC/H.264&#xff0c;MPEG1&#xff0c;MPEG2 等&#xff…

常见视频编码格式解析

常见视频编码格式解析 文章目录 常见视频编码格式解析1、MPEG2-TS编码技术1.1. MPEG-TS简介1.2. 基本概念及TS流概述1.3. 基本流程1.4. TS流传输包(简称TS包)结构分析1.4.1. TS包包头1.4.2. TS包净荷部分1.5. PS节目流2、MPEG-4编码技术2.1. MPEG-4概述2.2. MPEG-4各部分2.3.…

视频编码全流程

视频编解码用到的一些算法&#xff1a; 正反傅里叶变换、fft算法 dct变换、快速dct变换 如何自己实现一个视频编解码器&#xff1a; (1)取一帧作为I帧&#xff0c;类似jpeg压缩编码&#xff0c;也就是 rgb转yuv&#xff0c;然后dct去除高频信息。因为这种压缩会造成边界bloc…

视频编码技术详解

1、引言 如今我们所处的时代&#xff0c;是移动互联网时代&#xff0c;也可以说是视频时代。从快播到抖音&#xff0c;从“三生三世”到“延禧攻略”&#xff0c;我们的生活&#xff0c;被越来越多的视频元素所影响。 而这一切&#xff0c;离不开视频拍摄技术的不断升级&#x…

FIO源码解读测试

在磁盘测试中&#xff0c;fio是最常用的测试的工具&#xff0c;其下载网址为https://github.com/axboe/fio; 对于fio,其测试命令有许多&#xff0c;这个大家很容易就可以查到&#xff0c;此处不讲解具体的测试命令&#xff0c; 而是讲一下大概的源码框架。 Fio的入口函数在fio.…

fio引发的一些问题

fio引发的一些问题 奇怪的255扇区在nvme驱动中插入打印语句直接编译模块加载源码编译内核 查找内核源码 奇怪的255扇区 由于块设备驱动项目需要测试读写速度&#xff0c;故使用fio工具&#xff0c;没想着深入了解&#xff0c;简单测个速就可以 使用tldr命令得到测试磁盘读写的…

【fio】关于磁盘性能测试

一、关于磁盘 磁盘是可以持久化存储的设备&#xff0c;根据存储介质的不同&#xff0c;常见磁盘可以分为两类&#xff1a;机械磁盘和固态磁盘。 第一类&#xff0c;机械磁盘&#xff0c;也称为硬盘驱动器&#xff08;Hard Disk Driver&#xff09;&#xff0c;通常缩写为 HDD。…

【测试】 FIO:ceph/磁盘IO测试工具 fio(iodepth深度)

目录 随看随用 NAS文件系统测试 块系统测试 FIO用法 FIO介绍 FIO 工具常用参数&#xff1a; FIO结果说明 I/O 的重放&#xff08;录下实际工况的IO&#xff0c;用fio重放&#xff09; fio工作参数可以写入配置文件 fio的iodepth参数说明 IO状态监控&#xff1a; Ios…

FIO详解

fio - Flexible IO Tester 一、服务器配置&#xff1a; 由于我们想通过fio得到SSD真实的参数信息&#xff0c;因此我们需要服务器BIOS一些参数的配合&#xff0c;以便能更好的体现硬盘的性能。 以华为1288HV5为例&#xff1a; 二、fio 1.安装 a.下载地址&#xff1a;htt…