거두절미하고 핵심!!
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
보는 것과 같이 매우 간단하다. 더 자세한 내용은 추후에 보충하도록 하겠다.
댓글 없음:
댓글 쓰기