ffmpeg 获取视频时长
时间: 2023-08-10 11:02:19 浏览: 77
在FFmpeg中,获取视频时长可以通过AVFormatContext中的duration字段来实现,该字段表示音视频文件的总时长,单位是微秒(us)。如果duration为AV_NOPTS_VALUE,则表示无法获取时长。
具体实现代码如下:
```c
AVFormatContext *fmt_ctx = NULL;
if (avformat_open_input(&fmt_ctx, filename, NULL, NULL) != 0) {
printf("Failed to open file '%s'\n", filename);
return -1;
}
if (avformat_find_stream_info(fmt_ctx, NULL) < 0) {
printf("Failed to retrieve input stream information\n");
return -1;
}
int64_t duration = fmt_ctx->duration;
if (duration != AV_NOPTS_VALUE) {
int hours, mins, secs, us;
secs = duration / AV_TIME_BASE;
us = duration % AV_TIME_BASE;
mins = secs / 60;
secs %= 60;
hours = mins / 60;
mins %= 60;
printf("Duration: %02d:%02d:%02d.%02d\n", hours, mins, secs, (100 * us) / AV_TIME_BASE);
} else {
printf("Duration: N/A\n");
}
avformat_close_input(&fmt_ctx);
```
在这个例子中,我们首先使用avformat_open_input函数打开音视频文件,然后通过avformat_find_stream_info函数获取音视频文件的流信息,接着获取AVFormatContext的duration字段,如果duration不为AV_NOPTS_VALUE,则表示获取到了时长,我们将其转换为时分秒的格式进行输出。最后,我们需要调用avformat_close_input函数关闭文件并释放资源。
需要注意的是,由于duration字段的单位是微秒,因此我们需要将其转换为秒,进而转换为时分秒格式。另外,如果获取时长失败,则duration的值将为AV_NOPTS_VALUE,我们需要做特殊处理。