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