如何使用libavcodec / ffmpeg查找视频文件的持续时间

时间:2011-06-23 09:17:09

标签: c++ ffmpeg

我需要一个库来执行视频文件的长度,大小等基本功能(我猜测元数据或标签)所以我选择了 ffmpeg 。有效的视频格式主要是电影文件中流行的格式。 wmv,wmvhd,avi,mpeg,mpeg-4 等。如果可以的话,请帮助我了解用于了解视频文件的持续时间。我在Linux平台上。

4 个答案:

答案 0 :(得分:31)

libavcodec非常难以编程,而且很难找到文档,所以我感到很痛苦。 This tutorial是一个好的开始。 Here是主要的API文档。

查询视频文件的主要数据结构是AVFormatContext。在本教程中,这是您使用av_open_input_file打开的第一件事 - 该文档说它已被弃用,您应该使用avformat_open_input

从那里,你可以在AVFormatContext中读取属性:duration在几分之一秒内(参见文档),file_size以字节为单位,bit_rate等。

所以把它放在一起应该看起来像:

AVFormatContext* pFormatCtx = avformat_alloc_context();
avformat_open_input(&pFormatCtx, filename, NULL, NULL);
int64_t duration = pFormatCtx->duration;
// etc
avformat_close_input(&pFormatCtx);
avformat_free_context(pFormatCtx);

如果您的文件格式没有标题,例如MPEG,您可能需要在avformat_open_input之后添加此行以从数据包中读取信息(这可能会更慢):

avformat_find_stream_info(pFormatCtx, NULL);

修改

  • 在代码示例中添加了pFormatCtx的分配和解除分配。
  • 添加avformat_find_stream_info(pFormatCtx, NULL)以处理没有标题的视频类型,例如MPEG

答案 1 :(得分:10)

我必须添加一个对

的调用
avformat_find_stream_info(pFormatCtx,NULL)

avformat_open_input之后获得mgiuca的工作答案。 (不能发表评论)

#include <libavformat/avformat.h>
...
av_register_all();
AVFormatContext* pFormatCtx = avformat_alloc_context();
avformat_open_input(&pFormatCtx, filename, NULL, NULL);
avformat_find_stream_info(pFormatCtx,NULL)
int64_t duration = pFormatCtx->duration;
// etc
avformat_close_input(&pFormatCtx);
avformat_free_context(pFormatCtx);

持续时间以u秒为单位,除以AV_TIME_BASE以获得秒数。

答案 2 :(得分:0)

使用此功能进行工作:

extern "C"
JNIEXPORT jint JNICALL
Java_com_ffmpegjni_videoprocessinglibrary_VideoProcessing_getDuration(JNIEnv *env,
                                                                      jobject instance,
                                                                      jstring input_) {
    av_register_all();
    AVFormatContext *pFormatCtx = NULL;
    if (avformat_open_input(&pFormatCtx, jStr2str(env, input_), NULL, NULL) < 0) {
        throwException(env, "Could not open input file");
        return 0;
    }


    if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
        throwException(env, "Failed to retrieve input stream information");
        return 0;
    }

    int64_t duration = pFormatCtx->duration;

    avformat_close_input(&pFormatCtx);
    avformat_free_context(pFormatCtx);
    return (jint) (duration / AV_TIME_BASE);
}

当我使用(jint)(持续时间/ AV_TIME_BASE)时,此视频持续时间出错了。

答案 3 :(得分:-3)

AVFormatContext* pFormatCtx = avformat_alloc_context();

会导致内存泄漏。

应为AVFormatContext* pFormatCtx = NULL