ffmpeg cc++ 获取帧计数或时间戳和 fps

作者:编程家 分类: c++ 时间:2025-10-11

使用FFmpeg C/C++获取帧计数或时间戳和FPS

介绍

FFmpeg是一个开源的跨平台音视频处理工具库,可以进行音视频编解码、转码、流媒体处理等操作。在使用FFmpeg进行视频处理时,经常需要获取视频的帧计数或时间戳以及帧率(FPS)。本文将介绍如何使用FFmpeg C/C++获取视频的帧计数或时间戳和FPS,并提供相应的示例代码。

获取帧计数或时间戳

要获取视频的帧计数或时间戳,首先需要打开视频文件,并获取视频流。然后,通过读取视频流中的帧,可以获取每一帧的时间戳或帧计数。

下面是一个使用FFmpeg C/C++获取帧计数或时间戳的示例代码:

c

#include

#include

#include

#include

#include

int main(int argc, char *argv[]) {

AVFormatContext *formatContext = NULL;

AVPacket packet;

int videoStreamIndex = -1;

int frameCount = 0;

// 打开视频文件

if (avformat_open_input(&formatContext, argv[1], NULL, NULL) != 0) {

fprintf(stderr, "无法打开视频文件\n");

return -1;

}

// 查找视频流

if (avformat_find_stream_info(formatContext, NULL) < 0) {

fprintf(stderr, "无法找到视频流\n");

return -1;

}

// 查找视频流索引

for (int i = 0; i < formatContext->nb_streams; i++) {

if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {

videoStreamIndex = i;

break;

}

}

// 读取每一帧并获取帧计数或时间戳

while (av_read_frame(formatContext, &packet) >= 0) {

if (packet.stream_index == videoStreamIndex) {

// 获取帧计数

printf("帧计数: %d\n", frameCount);

frameCount++;

// 获取时间戳

printf("时间戳: %lld\n", packet.pts);

}

av_packet_unref(&packet);

}

// 释放资源

avformat_close_input(&formatContext);

avformat_free_context(formatContext);

return 0;

}

获取帧率(FPS)

要获取视频的帧率(FPS),可以通过读取视频流的元数据中的帧率信息来实现。

下面是一个使用FFmpeg C/C++获取帧率的示例代码:

c

#include

#include

#include

#include

#include

int main(int argc, char *argv[]) {

AVFormatContext *formatContext = NULL;

int videoStreamIndex = -1;

// 打开视频文件

if (avformat_open_input(&formatContext, argv[1], NULL, NULL) != 0) {

fprintf(stderr, "无法打开视频文件\n");

return -1;

}

// 查找视频流

if (avformat_find_stream_info(formatContext, NULL) < 0) {

fprintf(stderr, "无法找到视频流\n");

return -1;

}

// 查找视频流索引

for (int i = 0; i < formatContext->nb_streams; i++) {

if (formatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {

videoStreamIndex = i;

break;

}

}

// 获取帧率

AVRational frameRate = formatContext->streams[videoStreamIndex]->r_frame_rate;

double fps = av_q2d(frameRate);

printf("帧率(FPS): %.2f\n", fps);

// 释放资源

avformat_close_input(&formatContext);

avformat_free_context(formatContext);

return 0;

}

本文介绍了如何使用FFmpeg C/C++获取视频的帧计数或时间戳和帧率(FPS)。通过打开视频文件、查找视频流、读取每一帧并获取帧计数或时间戳,以及读取视频流的元数据中的帧率信息,可以轻松地实现这些功能。使用FFmpeg进行视频处理时,这些信息对于视频编辑、剪辑、分析等操作非常有用。希望本文对你在使用FFmpeg获取视频信息时有所帮助。

参考资料

- FFmpeg官方文档:https://ffmpeg.org/documentation.html