您的位置:

详解ffmpeg获取视频时长

一、ffmpeg获取视频时长代码

AVFormatContext *pFormatCtx = NULL;
if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0) {
    // Failed to open file or unknown error occurred
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
    // Failed to retrieve stream information
}
int duration = pFormatCtx->duration / AV_TIME_BASE;

这段代码展示了如何使用ffmpeg在C++中获取视频文件的时长。首先,打开文件并获得AVFormatContext“格式上下文”结构体的指针。接着使用avformat_find_stream_info函数来获取文件的媒体流信息。最后通过duration字段获取文件时长,单位是毫秒,需要除以AV_TIME_BASE才能得到秒数。

二、ffmpeg获取视频码率

AVFormatContext *pFormatCtx = NULL;
if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0) {
    // Failed to open file or unknown error occurred
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
    // Failed to retrieve stream information
}
int bitrate = pFormatCtx->bit_rate;

这段代码展示了如何使用ffmpeg在C++中获取视频文件的码率。描述同上,但是码率单位是比特每秒。

三、ffmpeg获取视频时长为负数

在某些情况下,pFormatCtx->duration的值可以是负数。这种情况发生在视频文件不包含时长信息时,ffmpeg无法确定媒体流中的最后一帧在文件中的时间戳。

if (pFormatCtx->duration <= 0) {
    int64_t last_dts = av_rescale_q(pFormatCtx->streams[0]->nb_frames - 1, pFormatCtx->streams[0]->time_base, AV_TIME_BASE_Q);
    int64_t last_pts = av_rescale_q(pFormatCtx->streams[0]->nb_frames - 1, pFormatCtx->streams[0]->time_base, AV_TIME_BASE_Q);
    if (last_dts > last_pts) {
        duration = (int)(last_dts / AV_TIME_BASE);
    } else {
        duration = (int)(last_pts / AV_TIME_BASE);
    }
}

这段代码展示了如果duration小于等于0时,计算文件时长的方法。首先,计算最后一帧的时间戳(即dts和pts中较大的那个)。最后将时间戳除以AV_TIME_BASE得到秒数。

四、ffmpeg获取视频时长帧数原理

在做视频处理时,有时候需要知道视频的帧数以计算处理时间,以下是ffmpeg计算帧数的原理。

AVFormatContext *pFormatCtx = NULL;
if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0) {
    // Failed to open file or unknown error occurred
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
    // Failed to retrieve stream information
}
AVStream *videoStream = NULL;
for (int i = 0; i < pFormatCtx->nb_streams; i++) {
    if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
        videoStream = pFormatCtx->streams[i];
        break;
    }
}
int frameCount = (int)(videoStream->duration * videoStream->avg_frame_rate.num / videoStream->avg_frame_rate.den);

这段代码展示了如何使用ffmpeg在C++中获取视频文件帧数。首先,获取视频流。接着计算帧数,计算公式为:duration * avg_frame_rate.num / avg_frame_rate.den。

五、ffmpeg获取视频信息

AVFormatContext *pFormatCtx = NULL;
if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0) {
    // Failed to open file or unknown error occurred
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
    // Failed to retrieve stream information
}
av_dump_format(pFormatCtx, 0, filename, 0);

这段代码展示了如何使用ffmpeg在C++中获取视频文件的基本信息。调用av_dump_format函数输出视频的基本信息,如格式、时长、码率、帧率等信息。

六、ffmpeg获取视频帧率

AVFormatContext *pFormatCtx = NULL;
if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0) {
    // Failed to open file or unknown error occurred
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
    // Failed to retrieve stream information
}
AVStream *videoStream = NULL;
for (int i = 0; i < pFormatCtx->nb_streams; i++) {
    if (pFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
        videoStream = pFormatCtx->streams[i];
        break;
    }
}
float frameRate = av_q2d(videoStream->r_frame_rate);

这段代码展示了如何使用ffmpeg在C++中获取视频文件的帧率。首先,获取视频流。接着使用av_q2d函数将AVRational结构体转换为浮点数,得到帧率。

七、ffmpeg获取视频长度

AVFormatContext *pFormatCtx = NULL;
if (avformat_open_input(&pFormatCtx, filename, NULL, NULL) != 0) {
    // Failed to open file or unknown error occurred
}
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
    // Failed to retrieve stream information
}
int64_t duration = pFormatCtx->streams[0]->duration;

这段代码展示了如何使用ffmpeg在C++中获取视频文件的长度。获取第一个媒体流的duration字段,可以得到视频文件长度,单位是毫秒。

八、ffmpeg 视频时长

以下是使用ffmpeg命令行获取视频文件时长的方法。

ffmpeg -i filename -vcodec copy -acodec copy -f null /dev/null

输出示例:

duration: 00:00:05.01, bitrate: 556 kb/s

九、ffmpeg 获取视频流

以下是使用ffmpeg命令行获取视频文件数据流的方法。

ffmpeg -i filename -c copy output.mp4

输出示例:

Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 480x270, 307 kb/s, 25 fps, 25 tbr, 90k tbn, 180k tbc (default)

总结

本文详细介绍了ffmpeg获取视频时长的多个方面,包括获取视频时长代码、获取视频码率、获取视频帧数、获取视频信息、获取视频帧率和获取视频长度等。此外,还介绍了在一些情况下,ffmpeg获取到的视频时长可能为负数的解决方法,以及使用ffmpeg命令行获取视频时长和视频数据流的方法。