FFmpeg视频处理入门级教程

ffmpeg软件使用手册 FFmpeg是一个强大的跨平台音视频处理工具,可以进行格式转换、剪辑、合并、压缩等操作。本文将介绍如何安装FFmpeg,并提供详细的使用教程。 阅读详情

在这里插入图片描述

一、FFmpeg常规处理流程

是
否
初始化上下文
打开媒体文件
查找流信息
获取视频流索引
获取解码器
打开解码器
循环读取数据包
是否视频流?
解码数据包
处理解码帧
释放资源

文字说明:

  1. 初始化容器格式和编解码器
  2. 打开输入文件建立连接
  3. 解析媒体流信息(时长/分辨率/编码格式等)
  4. 遍历找到视频流索引
  5. 根据编码器ID查找对应解码器
  6. 初始化并配置解码器上下文
  7. 循环读取压缩数据包
  8. 判断数据包类型并解码视频帧
  9. 对原始帧进行格式转换或处理
  10. 释放所有分配的资源

二、FFmpeg核心模块解析

2.1 模块预览

FFmpeg由多个功能模块组成,以下是8个核心模块的详细说明:

模块名称功能描述典型应用场景
libavcodec编解码库,包含主流音视频编码器的实现H.264解码、MP3编码、音频重采样
libavformat封装/解封装库,处理多媒体容器格式(MP4/MKV/FLV等)解析MP4文件头信息、将H.264流封装为TS格式
libavutil基础工具库,提供通用数据结构、数学运算等基础功能时间戳计算、内存管理、日志输出
libswscale图像处理库,实现色彩空间转换和图像缩放YUV420转RGB24、4K视频缩放到1080p
libavfilter滤镜处理库,支持多路视频流的复杂滤镜处理添加水印、视频画中画、音频混音
libavdevice设备访问库,支持采集显示设备数据摄像头抓取画面、屏幕录制、音频采集卡输入
libswresample音频重采样库,处理音频格式转换48kHz转44.1kHz、单声道转立体声、PCM格式转换
libpostproc后处理库,提供视频后期效果处理视频去块效应、MPEG视频补偿

模块依赖关系:

avformat → avcodec → avutil
avfilter → avformat
swscale/swresample → avutil

2.2 部分模块说明详解:

libavcodec 工作机理:

输入编码数据
解析帧头信息
初始化解码器
空间分配
熵解码
反量化
反变换
运动补偿
输出YUV帧

libavfilter 处理链示例:

// 创建滤镜图:视频缩放+叠加水印
filter_graph = avfilter_graph_alloc();
avfilter_graph_create_filter(&buffer_src_ctx, "输入源");
avfilter_graph_create_filter(&scale_filter, "scale=640:480");
avfilter_graph_create_filter(&overlay_filter, "overlay=10:10");
avfilter_graph_create_filter(&buffer_sink_ctx, "输出端");

// 连接滤镜节点
avfilter_link(buffer_src_ctx, 0, scale_filter, 0);
avfilter_link(scale_filter, 0, overlay_filter, 0);
avfilter_link(overlay_filter, 0, buffer_sink_ctx, 0);

模块选择原则:

  1. 文件操作:优先使用avformat
  2. 编解码处理:使用avcodec
  3. 图像处理:使用swscale或avfilter
  4. 实时流采集:配合avdevice使用

三、核心API函数说明

函数名称功能描述关键参数说明
av_register_all()注册所有封装格式与编解码器(新版本已弃用)无参数
avformat_open_input()打开媒体文件并初始化AVFormatContextps: 上下文指针地址
url: 文件路径
fmt: 强制指定格式(可NULL)
avformat_find_stream_info()获取媒体流详细信息ic: 上下文指针
options: 额外选项(通常NULL)
avcodec_find_decoder()根据编码ID查找解码器id: 编码格式ID(如AV_CODEC_ID_H264)
avcodec_open2()打开解码器avctx: 解码器上下文
codec: 解码器指针
options: 额外参数
av_read_frame()读取媒体文件中的数据包s: 上下文指针
pkt: 输出的数据包
avcodec_send_packet()发送压缩数据到解码器avctx: 解码器上下文
avpkt: 输入数据包
avcodec_receive_frame()从解码器获取解码后的帧avctx: 解码器上下文
frame: 输出的原始帧
sws_getContext()初始化图像缩放转换上下文参数包含源/目标分辨率、格式等图像特征
sws_scale()执行像素格式转换和缩放sws_ctx: 转换上下文
srcSlice: 源数据指针

四、视频解码显示实战

实现一个ffmpeg读取视频文件,并使用opencv进行显示的例子。

4.1 实现流程图

否
是
是
初始化FFmpeg
打开视频文件
获取视频流信息
定位视频流索引
配置解码器
初始化SWS转换上下文
循环读取帧
解码完成?
读取数据包
是视频包?
发送到解码器
接收解码帧
转换为RGB格式
OpenCV显示
释放资源

4.2 完整实现代码

#include <opencv2/opencv.hpp>
extern "C" {
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}

int main() {
    // 初始化FFmpeg
    avformat_network_init();
    AVFormatContext* fmt_ctx = NULL;
    
    // 打开输入文件
    if(avformat_open_input(&fmt_ctx, "test.mp4", NULL, NULL) != 0){
        printf("无法打开文件\n");
        return -1;
    }

    // 获取流信息
    if(avformat_find_stream_info(fmt_ctx, NULL) < 0){
        printf("无法获取流信息\n");
        return -1;
    }

    // 查找视频流索引
    int video_stream = -1;
    for(int i=0; i<fmt_ctx->nb_streams; i++){
        if(fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){
            video_stream = i;
            break;
        }
    }

    // 获取解码器参数
    AVCodecParameters* codec_par = fmt_ctx->streams[video_stream]->codecpar;
    const AVCodec* decoder = avcodec_find_decoder(codec_par->codec_id);
    
    // 初始化解码器上下文
    AVCodecContext* codec_ctx = avcodec_alloc_context3(decoder);
    avcodec_parameters_to_context(codec_ctx, codec_par);
    avcodec_open2(codec_ctx, decoder, NULL);

    // 准备转换上下文(YUV->RGB)
    SwsContext* sws_ctx = sws_getContext(
        codec_ctx->width, codec_ctx->height, codec_ctx->pix_fmt,
        codec_ctx->width, codec_ctx->height, AV_PIX_FMT_RGB24,
        SWS_BILINEAR, NULL, NULL, NULL);

    // 准备帧结构
    AVFrame* frame = av_frame_alloc();
    AVFrame* rgb_frame = av_frame_alloc();
    uint8_t* buffer = (uint8_t*)av_malloc(av_image_get_buffer_size(
        AV_PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height, 1));
    av_image_fill_arrays(rgb_frame->data, rgb_frame->linesize, 
        buffer, AV_PIX_FMT_RGB24, codec_ctx->width, codec_ctx->height, 1);

    AVPacket pkt;
    while(av_read_frame(fmt_ctx, &pkt) >= 0){
        if(pkt.stream_index == video_stream){
            // 发送到解码器
            avcodec_send_packet(codec_ctx, &pkt);
            
            // 接收解码帧
            while(avcodec_receive_frame(codec_ctx, frame) == 0){
                // 格式转换
                sws_scale(sws_ctx, 
                    (const uint8_t* const*)frame->data, frame->linesize,
                    0, codec_ctx->height,
                    rgb_frame->data, rgb_frame->linesize);

                // OpenCV显示
                cv::Mat img(codec_ctx->height, codec_ctx->width, 
                    CV_8UC3, rgb_frame->data[0]);
                cv::imshow("Video", img);
                cv::waitKey(1);
            }
        }
        av_packet_unref(&pkt);
    }

    // 释放资源
    av_frame_free(&frame);
    av_frame_free(&rgb_frame);
    avcodec_free_context(&codec_ctx);
    avformat_close_input(&fmt_ctx);
    sws_freeContext(sws_ctx);
    return 0;
}

4.3 关键代码解析

  1. 图像转换配置:
sws_ctx = sws_getContext(   // 创建转换器实例
    srcW, srcH, srcFormat,  // 源图像参数
    dstW, dstH, dstFormat,  // 目标图像参数
    flags,                  // 缩放算法选择
    ...);                   // 其他可选参数
  1. OpenCV显示核心:
cv::Mat img(height, width,        // 创建Mat对象
    CV_8UC3,                      // 数据类型:8位无符号3通道
    rgb_frame->data[0],           // RGB数据首地址
    rgb_frame->linesize[0]);      // 每行字节数(步长)
  1. 解码循环逻辑:
while(av_read_frame() >=0){       // 读取压缩包
    if(视频流){
        avcodec_send_packet();    // 送入解码队列
        while(avcodec_receive_frame() ==0){ // 获取解码帧
            // 处理帧数据
        }
    }
    av_packet_unref();            // 必须释放数据包
}

五、常见问题处理

  1. 颜色显示异常:检查像素格式转换参数(AV_PIX_FMT_RGB24)
  2. 无法打开文件:检查文件路径和FFmpeg的协议支持
  3. 内存泄漏:确保每个av_malloc都有对应的av_free
  4. 花屏现象:检查解码器是否成功初始化,数据包是否完整
FFmpeg的简单使用【Windows】 下方图像描述了如何使用FFmpeg将一个分辨率为1280*720的MP4视频文件转换为一个分辨率为1920*1080的FLV视频文件,同时保持视频流不变。用途:控制输出视频的质量,比特率越高,通常视频质量越好,但文件大小也会越大。的视频比特率设置为400kbps,音频比特率设置为192kbps,并输出到。用途:用于限制输出音频的长度,特别适用于需要精确控制输出音频帧数的情况。用途:控制输出音频的质量,比特率越高,通常音质越好,但文件大小也会越大。用途:改变输出音频的采样率,通常用于提高或降低音频的质量。 阅读详情

相关推荐

FFMPEG详解(完整版)

对于输入,以下选项通常是自动识别的,但也可以强制设定。常用输出选项。

2501_90209641的博客 3810

FFmpeg教程(超级详细版)

一、参考资料 通过ffmpeg把图片转换成视频 FFmpeg命令(一)、使用filter_complex命令拼接视频 FFmpeg 视频处理入门教程给新手的 20 多个 FFmpeg 命令示例 FFmpeg命令行转码 ffmpeg 翻译文档 (ffmpeg-all 包含重要组件) FFmpeg Filters Documentation FFmpeg命令行滤镜使用 ffmpeg命令行使用nvidia CUDA scaling高速转分辨率转码(libnpp) FFmpeg—源码编译 FFmpeg常用命令 Li

IT菜鸟 11万+

FFmpeg工具(一) --- ffmpeg视频处理命令行大全

FFmpeg是视频处理最常用的开源软件。 它功能强大,用途广泛,大量用于视频网站,也是许多音视频格式的标准编解码实现。 FFmpeg的使用格式 ffmpeg的命令行参数非常多,可以分成五个部分。 $ ffmpeg {1} {2} -i {3} {4} {5} $ ffmpeg [全局参数] [输入文件参数] -i [输入文件] [输出文件参数] [输出文件] 上面命令中,参数依次为1.全局参数,2.输入文件参数,3.输入文件,4.输出文件参数,5.输出文件。 比如: $ ffmpeg \ -y \

weixin_39432879的博客 3153

FFmpeg入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

FFmpeg全称为Fast Forward Moving Picture Experts Group,于2000年诞生,是一款免费,开源的音视频编解码工具及开发套件。它的功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube 和 iTunes)。FFmpeg 本身是一个庞大的项目,包含许多组件和库文件,最常用的是它的命令行工具example:对输入视频缩放至320:240:ffmpeg -i input.mpg -vf scale=320:240 output.mp4。

Javachichi的博客 9万+

利用ffmpeg+QSV进行视频处理

引言 ffmpeg是一个视频处理领域的“瑞士军刀”,在很多应用中都会用到,这里就不详细介绍它的使用啦,有需要的可以参考其官方文档和大量网上的资料。 这里着重介绍一下qsv这个东东,qsv的全称是Quick Sync Video Acceleratio,是Intel提供的一个对数字视频通用解决方案(其实是对其芯片——集成显卡或者独立显卡视频处理的专用支持库),说穿了就是可以利用相应的Intel硬件支持实施硬件加速的视频处理。 这里我也不再说那么多的题外话啦,重点就是怎么才能用上qsv吧。首先就是使用条件 使用

电子芯吧客的博客 6518

ffmpeg视频处理教程

1、ffmpeg简介FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。

yinshipin007的博客 1926

FFmpeg视频处理入门教程(新手必看)

调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。本文主要介绍了FFmpeg视频处理入门教程,它功能强大,用途广泛,是许多音频和视频格式的标准编码/解码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。它功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube 和 iTunes),也是许多音频和视频格式的标准编码/解码实现。上面例子中,只是转一下容器,内部的编码格式不变,所以使用-c copy指定直接拷贝,不经过转码,这样比较快。

yinshipin007的博客 2460

FFmpeg进行视频处理的典型示例

FFmpeg是一个功能强大的多媒体处理工具,它提供了丰富的命令行选项和API,可以用于各种视频处理任务,如转码、剪辑、合并、过滤、水印、缩放等。

bai915290475的博客 1025

视频处理的利器,ffmpeg-python库详解与应用示例

是一个Python第三方库,关于Python第三方库,可以看这里,《Python第三库介绍它封装了FFmpeg命令行工具的功能,使得在Python脚本中调用FFmpeg变得非常简单,所以在使用这个Python库之前是要安装FFmpeg的。FFmpeg是一个开源的多媒体处理工具,支持广泛的视频格式转换、音视频处理以及流媒体处理等任务。通过,用户可以在Python代码中执行各种视频和音频处理任务,而无需直接使用命令行。

一点 1万+

PHP与FFmpeg的视频处理实战教程

PHP和FFmpeg结合的使用主要在于多媒体应用领域。FFmpeg是一个强大的视频处理工具,它能够处理几乎所有的视频格式,包括转码、切割、合并、特效添加等多种功能。而PHP,作为服务器端脚本语言,通过调用FFmpeg命令行工具,可以扩展其处理多媒体的能力。此组合使得开发者能够通过Web页面快速实现视频文件的处理。

weixin_36328210的博客 1062

从零开始了解数据采集(五)——工业通信协议:数据采集的“语言”桥梁

数据采集常用的通信协议有哪一些?看完这篇你就了解了~

李恒的博客 4055

FFmpeg 视频处理入门教程(转)

FFmpeg 视频处理入门教程(阮一峰) FFmpeg 是视频处理最常用的开源软件。 它功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube 和 iTunes),也是许多音频和视频格式的标准编码/解码实现。 FFmpeg 本身是一个庞大的项目,包含许多组件和库文件,最常用的是它的命令行工具。本文介绍 FFmpeg 命令行如何处理视频,比桌面视频处理软件更简洁高效。 如果你还没安装,可以根据官方文档 先完成安装。 一、概念 介绍 FFmpeg 用法之前,需要了解一些视频处理的基本概念。 1.1

livein80的博客 2146

VS2019 C# MySQL 学生信息增删改查(一、增删)

VS2019 C# MySQL 学生信息增删改查 由于刚刚学习VS2019,入手的第一个例子是编写一个简单的增删改查。这里,我以学生信息为例,进行详细的过程描述以及代码实现。 一、 新建一个Windows窗体应用程序 1、创建新项目界面,如下图所示。 2、更改项目名称,当然不修改也可以。我这里的是“StudentInfoSystem”;项目存放位置路径根据自己需要进行更改;“将解决方案和项目放在同一目录中”前面的勾选框,选不选都可以;点击“创建”,如下图所示。 二、前期准备工作 1、将Form1属性中

青哥 1万+

FFmpeg 视频处理入门教程

ffmpeg视频处理入门教程

weixin_44966641的博客 774

MySQL根据idb文件恢复数据

恢复前提 MySQL 5.* 和 8.* 的恢复方式大同小异,最基本的区别是8.* 中,不再有表结构frm文件,所以要恢复 8.* 的数据,就必须要有完整的建表语句。 而恢复 5.* 的数据,就需要idb文件和 frm文件,当然,如果有完整的建表语句的话,不用frm文件也行。 恢复步骤 需要注意的是,以下操作需要选定数据库后执行。 5.* 恢复表结构 确定表列数 首先创建一张 与需要恢复数据的表 的名字相同的新表,如果已知原表的字段数量的话,就按照原表字段数建表,字段名和类型都不用考虑,如果不知道数量的话,

weixin_45121446的博客 5447

ccproxy 6.61 注册机(纯绿/傻瓜/真正去除线程限制)

导读:   软件介绍   1、 CCPROXY 6.61 注册机(纯绿/傻瓜/真正去除线程限制)   ***前言,这次的升级官方改动不大,据说只是为了不被某些软件当病毒***   附件包中解压即免安装版,CcREGTOOLFF.exe为注册机。   本人继续向大家隆重推出《CCPROXY6.61哎呀……破解版》   还是那个提示:   在此之前,本人还是那句老话想提示大家,CCPROXY是

i53nd的专栏 1万+

ffmpeg jpg压缩_FFmpeg 视频处理入门教程

FFmpeg[1]是视频处理最常用的开源软件。它功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube 和 iTunes),也是许多音频和视频格式的标准编码/解码实现。FFmpeg 本身是一个庞大的项目,包含许多组件和库文件,最常用的是它的命令行工具。本文介绍 FFmpeg 命令行如何处理视频,比桌面视频处理软件更简洁高效。如果你还没安装,可以根据官方文档[2]先完成安...

weixin_34902900的博客 1019

CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。

点云侠的博客 2151

【FFmpeg】FFmpeg 视频处理入门教程

FFmpeg 视频处理入门教程 FFmpeg是视频处理最常用的开源软件。 它功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube 和 iTunes),也是许多音频和视频格式的标准编码/解码实现。 FFmpeg 本身是一个庞大的项目,包含许多组件和库文件,最常用的是它的命令行工具。本文介绍 FFmpeg 命令行如何处理视频,比桌面视频处理软件更简洁高效。 如果你还没安装...

menghaocheng的专栏 768

ONVIF协议简介与协议测试工具使用详解

Onvif协议及协议测试工具使用详解

dvlinker的技术专栏 3万+

如何在 R 中使用 Gamma 分布(附示例)

在统计学中,伽马分布通常用于模拟与等待时间相关的概率。我们可以使用以下函数来处理 R 中的 gamma 分布:dgamma(x, shape, rate) – 找到具有特定形状和速率参数的 gamma 分布的密度函数值。 pgamma(q, shape, rate) – 找到具有特定形状和速率参数的伽马分布的累积密度函数值。 qgamma(p, shape, rate) – 找到具有特定形状和速率参数的 gamma 分布的逆累积密度函数值。 rgamma(n, shape, rate) – 生成 n 个随机

Mrrunsen的博客 4415

FFmpeg视频处理

FFmpeg视频处理,包括视频抽帧、视频转码、视频裁剪和格式转换等操作

分享实践与思考 4699

手把手教你学Simulink--四翼无人机滑模控制器设计与仿真

四翼无人机(Quadcopter)滑模控制(Sliding Mode Control, SMC)是一种鲁棒性很强的非线性控制方法,特别适用于存在模型不确定性和外部扰动的情况。滑模控制器通过强制系统状态进入并保持在一个预定义的滑模面上,从而实现对期望轨迹或姿态的精确跟踪。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个基于滑模控制策略的四翼无人机系统。

MHD0815的博客 182

基于FFmpeg的Java视频处理系统开发

本文介绍了一套基于FFmpeg和SpringBoot的视频处理系统解决方案。系统实现了视频转码、切片、加密、水印添加、云存储上传等完整功能流程。文章详细阐述了Linux环境下FFmpeg的编译安装方法,提供了完整的安装脚本。系统采用模块化设计,包含视频转码服务、文件处理工具类、云存储集成等核心组件,支持异步处理和高并发。通过AES-128加密、HLS切片等技术保障视频内容安全,并提供了完善的错误处理和资源清理机制。该方案适用于在线教育、短视频等需要视频处理的场景,具备良好的扩展性,可根据业务需求进一步扩展为

yaosanwu的博客 1372

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: VS2022配置FFMPEG库基础教程
下一篇: ffmpeg新手入门的两大天坑,都是泪呀!
深图智能
博客等级 码龄3年 1036粉丝 91原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深图智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值