Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to use libavcodec/ffmpeg to find duration of video file

Tags:

c++

ffmpeg

I needed a library to perform basic functions such as length, size, etc of a video file (i'm guessing through the metadata or tags) so I chose ffmpeg. Valid video formats are primarily those prevalent in movie files viz. wmv, wmvhd, avi, mpeg, mpeg-4, etc. If you can, please help me with the method(s) to be used for knowing the duration the video file. I'm on a Linux platform.

like image 337
Kunal Vyas Avatar asked Jun 23 '11 09:06

Kunal Vyas


People also ask

How do you find the duration of a video in ffmpeg?

Getting the Duration To get the duration with ffprobe , add the -show_entries flag and set its value to format=duration . This tells ffprobe to only return the duration. To convert the above value into minutes and seconds, round it to an integer and divide it by 60.


2 Answers

libavcodec is pretty hard to program against, and it's also hard to find documentation, so I feel your pain. This tutorial is a good start. Here is the main API docs.

The main data structure for querying video files is AVFormatContext. In the tutorial, it's the first thing you open, using av_open_input_file -- the docs for that say it's deprecated and you should use avformat_open_input instead.

From there, you can read properties out of the AVFormatContext: duration in some fractions of a second (see the docs), file_size in bytes, bit_rate, etc.

So putting it together should look something like:

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);

If you have a file format with no headers, like MPEG, you may need to add this line after avformat_open_input to read information from the packets (which might be slower):

avformat_find_stream_info(pFormatCtx, NULL);

Edit:

  • Added allocation and de-allocation of pFormatCtx in the code example.
  • Added avformat_find_stream_info(pFormatCtx, NULL) to work with video types that have no headers such as MPEG
like image 195
mgiuca Avatar answered Oct 14 '22 21:10

mgiuca


I had to add a call to

avformat_find_stream_info(pFormatCtx,NULL)

after avformat_open_input to get mgiuca's answer to work. (can't comment on it)

#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);

The duration is in uSeconds, divide by AV_TIME_BASE to get seconds.

like image 30
seeseac Avatar answered Oct 14 '22 22:10

seeseac