大家好,小弟是刚接触ffmpeg的新手,有问题想请教各位:
我想通过ffmpeg得到视频文件的总帧数,文件的总时间以及码率,通过网上查找的资料写了段代码,但是没有成功,代码如下:
- C/C++ code
av_register_all(); err = av_open_input_file(&fctx, "s", NULL, 0, NULL); if (err < 0) { fprintf(stderr, "av_open_input_file: error %d\n", err); return 1; } err = av_find_stream_info(fctx); if (err < 0) { fprintf(stderr, "av_find_stream_info: error %d\n", err); return 1; } dump_format(fctx, 0, "s", 0);
dump_format(fctx, 0, "s", 0);
这个函数得到的内容如下:
Input #0, h264, from 's':
Duration: N/A, bitrate: N/A
Stream #0.0: Video: h264, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], 25 tbr, 1200k tbn, 50 tbc
fctx->bit_rate 结果是 0
pkt.duration 结果是一个超大的数;
还有就是想知道 25 tbr, 1200k tbn, 50 tbc 这是什么意思?
谢谢大家,给各位添加麻烦了!
------解决方案--------------------------------------------------------
不是所有参数都能得到的,有的文件没有这些信息,要看解析层而定。
楼主都有代码了,查查就知道了。
if(st->codec->codec_type == CODEC_TYPE_VIDEO){
if(st->r_frame_rate.den && st->r_frame_rate.num)
print_fps(av_q2d(st->r_frame_rate), "tbr");
if(st->time_base.den && st->time_base.num)
print_fps(1/av_q2d(st->time_base), "tbn");
if(st->codec->time_base.den && st->codec->time_base.num)
print_fps(1/av_q2d(st->codec->time_base), "tbc");
}
25 tbr代表帧率;1200k tbn代表文件层(st)的时间精度,即1S=1200k,和duration相关;50 tbc代表视频层(st->codec)的时间精度,即1S=50,和strem->duration和时间戳相关。
------解决方案--------------------------------------------------------
ffmpeg的使用
------解决方案--------------------------------------------------------
ffmpeg的AVFormatCtx是一步一步填充值的 你应该往下继续
------解决方案--------------------------------------------------------
建议看下:
如何基于FFMPEG和SDL写一个少于1000行代码的视频播放器
http://www.zixundao.com/thread-1519-1-1