2014년 5월 8일 목요일

libavformat을 이용해 영상의 길이와 프레임레이트를 구해보자 ( How to get the duration and frame rate using libavformat )

거두절미하고 핵심!!

int64_t AVFormatContext::duration
AVRational AVStream::avg_frame_rate
static double av_q2d ( AVRational a )

위에 적힌 저 세개만 알면 끝난다. 뭐 자세한 내용을 나중에 생각하고 아래 소스코드를 보도록 하자.


  1 ////////////////////////////////////////////////////////////////////////////////
  2 //
  3 // File name  : ffinfo.c
  4 // Last edit  : 2014-05-08 crazybird
  5 // Dependency : ffmpeg 2.1.x (libavformat.55.x.x)
  6 //
  7
  8
  9 #include <stdio.h>
 10 #include <stdint.h>
 11 #include <libavformat/avformat.h>
 12
 13
 14 int main(int argc, char** argv)
 15 {
 16     AVFormatContext *fmt_ctx = NULL;    // Format context
 17     int ret = 0;                        // Return value
 18     AVStream *st = NULL;                // Stream
 19     double fps = 0.0;                   // Video fps
 20     int64_t dur = 0;                    // General duration
 21     unsigned int nb_streams = 0;        // A list of all streams in the file
 22     unsigned int idx = 0;               // for(;;) iterator
 23
 24     // Verify arguments
 25     if (argc != 2)
 26     {
 27         printf(
 28             "usage: %s <input_file>\n"
 29             "example program to demonstrate the use of the "
 30             "libavformat metadata API.\n\n"
 31             , argv[0]);
 32
 33         return 1;
 34     }
 35
 36     av_register_all();  // Register URL Protocols.
 37
 38     // Open media file
 39     ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL);
 40     if (ret != 0)
 41     {
 42         return ret;
 43     }
 44
 45     // Find video stream index
 46     nb_streams = fmt_ctx->nb_streams;
 47     if (nb_streams > 0)
 48     {
 49         for (idx = 0; idx < nb_streams; idx++)
 50         {
 51             st = fmt_ctx->streams[idx];
 52             if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
 53             {
 54                 break;
 55             }
 56
 57             st = NULL;
 58         }
 59     }
 60
 61     // Is invalid stream?
 62     if (st == NULL)
 63     {
 64         printf("%s does not exist in the video stream.", argv[1]);
 65
 66         goto END;
 67     }
 68
 69     // IMPORTANT : Get general duration and video frame rate
 70     dur = fmt_ctx->duration;
 71     fps = av_q2d(st->avg_frame_rate);
 72
 73     // Output
 74     printf(
 75         "video fps=%f\n"
 76         "general duration=%lld\n"
 77         , fps, dur);
 78
 79 END:
 80     avformat_close_input(&fmt_ctx);
 81
 82     return 0;
 83 }

 84


보는 것과 같이 매우 간단하다. 더 자세한 내용은 추후에 보충하도록 하겠다.

댓글 없음:

댓글 쓰기