avformat_open_input timeout 设置30s
时间: 2023-09-03 08:10:43 浏览: 187
你可以使用 AVFormatContext 中的 `interrupt_callback` 字段来实现超时设置。具体实现步骤如下:
1. 首先定义一个回调函数,用于检测是否超时,示例代码如下:
```c++
int interrupt_callback(void *ctx)
{
AVFormatContext *format_ctx = (AVFormatContext *)ctx;
if (av_gettime_relative() - format_ctx->start_time >= 30 * 1000000) { // 超时时间为30秒
return 1; // 超时,返回非零值
} else {
return 0; // 未超时,返回零值
}
}
```
2. 在打开输入流之前,设置 `interrupt_callback` 回调函数和起始时间,示例代码如下:
```c++
AVFormatContext *format_ctx = avformat_alloc_context();
format_ctx->interrupt_callback.callback = interrupt_callback;
format_ctx->interrupt_callback.opaque = format_ctx;
format_ctx->start_time = av_gettime_relative();
int ret = avformat_open_input(&format_ctx, "input_filename", NULL, NULL);
```
3. 在读取媒体流之前,检查是否超时,示例代码如下:
```c++
while (av_read_frame(format_ctx, &packet) >= 0) {
if (format_ctx->interrupt_callback.callback && format_ctx->interrupt_callback.callback(format_ctx->interrupt_callback.opaque)) {
// 超时,退出循环
break;
}
// 处理媒体数据包
...
}
```
通过以上步骤,你就可以设置 AVFormatContext 的超时时间为30秒了。
阅读全文