FFmpeg学习:截取视频为图片

本文介绍了如何使用FFmpeg将视频文件的帧数据保存为PPM格式的图片。通过打开文件、处理数据、保存数据和释放资源等步骤,详细阐述了从视频流中提取并保存帧的过程,适合初学者理解FFmpeg的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

视频文件有几个基本组件。 首先,文件本身称为容器,容器的类型决定了文件中信息的位置。 比如AVI和Quicktime。 是一系列的streams, 通常有一个音频流和一个视频流。流中的数据元素称为帧。 每个流由不同种类的编解码器编码。 编解码器定义了数据是如何编码和解码的 - 因此称为CODEC。比如DivX和MP3. 数据包是可以包含数据的数据片段,这些数据可以被解码为原始帧,每个数据包包含完整的帧,在音频流下可能包含多个帧。

处理音视频数据不比较简单,主要分为以下几个步骤:

10 打开视频文件,获取streams
20 从video_stram中获取数据包,转换为帧
30 帧未读取完继续执行20
40 处理帧
50 跳转20

使用FFmpeg处理视频非常简单,本文介绍如何将一个视频文件的帧数据保存为一张ppm格式图片(ppm是一种非常简单的原始RGB数据文件,它包含一个非常简单的头信息,其余的数据全部是RGB数据).

打开文件

首先我们要将用到的库引入进来,编写一个错误输出函数:

#include <libavcodec/avcodec.h>
#include <libavutil/imgutils.h>
#include <libswscale/swscale.h>
#include <libavformat/avformat.h>
#include <libavutil/error.h>

void showErrMsg(int errNum, char *msg, size_t msgSize) {
    memset(msg, 0, msgSize);
    av_strerror(errNum, msg, msgSize);
    fprintf(stderr, msg);
}

该函数将FFmpeg内部的错误代码转换为了字符串,提高可读性.下面编写主函数,要求传入至少一个参数,并将该参数作为文件路径来打开.

fileName = argv[1];

if (argc < 2) {
    fprintf(stderr, "Please use FFmpegDemo1 <file> to open a video file");
    return -1;
}

if ((errNum = avformat_open_input(&pFormatCtx, fileName, NULL, NULL)) != 0) {
    showErrMsg(errNum, errMsg, 400);
    return -1;
}

在4版本中av_aregister_all()函数已经被废弃,不需要再编写任何信息

int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options)函数的作用是打开url指向的文件

AVFormatContext是FFmepg非常重要的一个结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值