FFMPEG无法显示视频的持续时间 [英] FFMPEG Can't Display The Duration Of a Video
问题描述
我想使用的ffmpeg从视频文件中捕捉帧,但我不能连得视频的持续时间。当我尝试用 pFormatCtx-&GT访问它每次;病程
我得到0。我知道指针初始化并包含正确的时间,因为如果我用 av_dump_format(pFormatCtx,0,videoName,0);
然后我实际上对视频等信息相处时间的数据。
这是我所得到的,当我使用 av_dump_format(pFormatCtx,0,videoName,0);
:
I'm trying to use ffmpeg to capture frames from a video file, but I can't even get the duration of a video. everytime when I try to access it with pFormatCtx->duration
I'm getting 0. I know the pointer initialized and contains the correct duration because if I use av_dump_format(pFormatCtx, 0, videoName, 0);
then I actually get the duration data along with other information about the video.
This is what I get when I use av_dump_format(pFormatCtx, 0, videoName, 0);
:
输入#0,AVI,从'futurama.avi':
Input #0, avi, from 'futurama.avi':
时间:00:21:36.28,启动:0.000000,比特率:1135 kb / s的
Duration: 00:21:36.28, start: 0.000000, bitrate: 1135 kb/s
流#0.0:视频:MPEG4(高级简单类),YUV420P,512x384
Stream #0.0: Video: mpeg4 (Advanced Simple Profile), yuv420p, 512x384
[PAR 1:1 DAR 4:3],25 TBR,25 TBN,25 TBC
[PAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc
流#0.1:音频:AC3,48000赫兹,立体声,S16,192 kb / s的
Stream #0.1: Audio: ac3, 48000 Hz, stereo, s16, 192 kb/s
我不明白为什么 av_dum_format
可显示时间,我不能。我查了函数的定义,以显示时间,该功能还使用pFormatCtx->时间。这不只是时间的其他成员变量也不会显示正确的数据,当我打电话给他们在main.cpp中
I don't understand why av_dum_format
can display duration and I can't. I checked the function definition, to display the duration, the function also uses pFormatCtx->duration. It's not just the duration other member variables also don't display the proper data when I call them in main.cpp
下面是我的main.cpp:
Here's my main.cpp:
extern "C" {
#include<libavcodec/avcodec.h>
#include<libavformat/avformat.h>
#include<libswscale/swscale.h>
}
int main(int argc, char *argv[]) {
AVFormatContext *pFormatCtx = NULL;
const char videoName[] = "futurama.avi";
// Register all formats and codecs.
av_register_all();
cout << "Opening the video file";
// Open video file
int ret = avformat_open_input(&pFormatCtx, videoName, NULL, NULL) != 0;
if (ret != 0) {
cout << "Couldn't open the video file." << ret ;
return -1;
}
if(avformat_find_stream_info(pFormatCtx, 0) < 0) {
cout << "problem with stream info";
return -1;
}
av_dump_format(pFormatCtx, 0, videoName, 0);
cout << pFormatCtx->bit_rate << endl; // different value each time, not initialized properly.
cout << pFormatCtx->duration << endl; // 0
return 0;
}
我不知道这是否可以帮助,但我用QtCreator在Ubuntu和链接库静态。
I don't know if it helps but, I use QtCreator on Ubuntu and linked the libraries statically.
感谢您的帮助。
推荐答案
持续时间属性是那么time_base
单位不毫秒或秒。以毫秒为单位转换为pretty容易,
The duration property is in time_base
units not milliseconds or seconds. The conversion to milliseconds is pretty easy,
double time_base = (double)video_stream->time_base.num / (double)video_stream->time_base.den;
double duration = (double)video_stream->duration * time_base * 1000.0;
持续时间现在是毫秒,只取地上或CEIL得到一个整数毫秒,无论你喜欢的。
The duration is now in msec, just take the floor or ceil to get a whole number of msec, whichever you like.
这篇关于FFMPEG无法显示视频的持续时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!