[Libav-user] Reading correct frame rate (fps) of input video

Taha Ansari mtaha.ansari at gmail.com
Wed May 22 09:28:42 CEST 2013


Like I spoke too soon, (I have also included time_base structure):

when tried on:

- FLV file: for r_frame_rate: {num=15 den=1 }, for avg_frame_rate: {num=0
den=0 }, for time_base: {num=1 den=1000 }

- WMV file: for r_frame_rate: {num=15 den=1 }, for avg_frame_rate: {num=0
den=0 }, for time_base: {num=1 den=1000 }

- AVI file: for r_frame_rate: {num=15 den=1 }, for avg_frame_rate:{num=0
den=0 }, for time_base: {num=1 den=15 }

- 3gp file: for r_frame_rate: {num=361 den=12 }, for avg_frame_rate:
{num=64350000 den=2139391 }, for time_base: {num=1 den=90000 } (30.08,
30.078 fps respectively)

- MP4 file: for r_frame_rate: {num=599 den=12 }, for avg_frame_rate:
{num=25 den=1 }, for time_base:  {num=1 den=90000 } (49.9, 25 fps
respectively - first figure is wrong).


So, is there any way to know for sure which structure I could surely rely
on?

Thanks again for your time..


On Wed, May 22, 2013 at 12:12 PM, Taha Ansari <mtaha.ansari at gmail.com>wrote:

> I just noticed one more thing:
>
> using:
>
>
> AVStream *st = pFormatCtx->streams[your_video_index];
> double frame_rate = st->r_frame_rate.num / (double)st->r_frame_rate.den;
>
> gives me correct values for 3gp files. When I tried this code on an MP4
> file, I got about 49.9 value, which was incorrect (actual was 25); looking
> at other values, I tried following:
>
>
> AVStream *st = pFormatCtx->streams[your_video_index ];
> double frame_rate    = st->avg_frame_rate.num /
> (double)st->avg_frame_rate.den;
>
> It worked fine for MP4: {num=25 den=1 }, and for 3gp, I get: {num=64350000
> den=2139391 } (30.078 FPS), which is also correct.
>
> So I assume this might be better structure to refer to, until it breaks
> again on another video...?
>
>
> On Wed, May 22, 2013 at 8:48 AM, Taha Ansari <mtaha.ansari at gmail.com>wrote:
>
>> Hi Guohui Huan!
>>
>> Many thanks for your guidance, I have got it working now!
>>
>> Thanks once again...
>>
>>
>> On Wed, May 22, 2013 at 5:58 AM, Guohui Huang <huanggh0108 at sina.com>wrote:
>>
>>> **
>>> You can get frame rate as follow:
>>> AVStream *st = pFormatCtx->streams[your_video_index];
>>> double frame_rate = st->r_frame_rate.num / (double)st->r_frame_rate.den;
>>>
>>> 2013-05-22
>>>  ------------------------------
>>>  Guohui Huang
>>>  ------------------------------
>>>  *发件人:*Taha Ansari <mtaha.ansari at gmail.com>
>>> *发送时间:*2013-05-21 23:04
>>> *主题:*[Libav-user] Reading correct frame rate (fps) of input video
>>> *收件人:*"This list is about using libavcodec, libavformat, libavutil,
>>> libavdevice and libavfilter."<libav-user at ffmpeg.org>
>>> *抄送:*
>>>
>>>  Hi!
>>>
>>> I am trying to read exact values for frame rate (fps) from any input
>>> video file. I have been trying to debug different structures like
>>> AVFormatCtx, etc. but cannot seem to figure it out. For a test case, here
>>> is the code I have managed (just the source snippet, include files etc. are
>>> all understandable):
>>>
>>>
>>> //---------------------------------------------------------------------------------------------------------------------------------------------------
>>>     // ++ test code begins ++//
>>>     av_register_all();
>>>     avcodec_register_all();
>>>     avformat_network_init();
>>>     avdevice_register_all();
>>>     AVFormatContext *pFormatCtx = NULL;
>>>     pFormatCtx = avformat_alloc_context();
>>>     string finalInputName = "test_input.3gp";
>>>     avformat_open_input(&pFormatCtx, finalInputName.c_str(), NULL, NULL);
>>>     if ( pFormatCtx == NULL            ||
>>>         pFormatCtx->iformat == NULL    )
>>>     {
>>>         return -1;
>>>     }
>>>     // Retrieve stream information
>>>     if(avformat_find_stream_info(pFormatCtx, NULL)<0)
>>>         return -1; // Couldn't find stream information
>>>
>>>     // Dump information about file onto standard error
>>>     av_dump_format(pFormatCtx, 0, finalInputName.c_str(), 0);
>>>     // -- test code ends --//
>>>
>>> //---------------------------------------------------------------------------------------------------------------------------------------------------
>>>
>>> The output it gives me is (in debug console):
>>>
>>>
>>> //---------------------------------------------------------------------------------------------------------------------------------------------------
>>> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test_input.3gp':
>>>   Metadata:
>>>     major_brand     : 3gp4
>>>     minor_version   : 0
>>>     compatible_brands: isom3gp4
>>>     creation_time   : 2013-05-20 11:54:39
>>>   Duration: 00:00:23.77, start: 0.000000, bitrate: 5882 kb/s
>>>     Stream #0:0(eng): Video: mpeg4 (Advanced Simple Profile) (mp4v /
>>> 0x7634706D)
>>> , yuv420p, 640x480 [SAR 1:1 DAR 4:3], 5752 kb/s, 30.08 fps, 30.08 tbr,
>>> 90k tbn,
>>> 300 tbc
>>>     Metadata:
>>>       creation_time   : 2013-05-20 11:54:39
>>>       handler_name    : VideoHandle
>>>     Stream #0:1(eng): Audio: aac (mp4a / 0x6134706D), 16000 Hz, stereo,
>>> s16, 127
>>>  kb/s
>>>     Metadata:
>>>       creation_time   : 2013-05-20 11:54:39
>>>       handler_name    : SoundHandle
>>>
>>> //---------------------------------------------------------------------------------------------------------------------------------------------------
>>>
>>> Like in above example, I can read that video is recorded at 30.08 fps,
>>> question is: it is apparently very simple for FFmpeg to figure this out,
>>> but how can I use this information from my own program? I was trying to
>>> follow code from FFmpeg source file (utils.c): [void
>>> av_dump_format(AVFormatContext *ic,  int index, const char *url, int
>>> is_output)], but was easily lost there.
>>>
>>> Can anyone kindly guide me how to intercept this problem?
>>>
>>> Thanks in advance for your time...
>>>
>>> _______________________________________________
>>> Libav-user mailing list
>>> Libav-user at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/libav-user
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130522/37ea1d81/attachment.html>


More information about the Libav-user mailing list