仍然不进入回调函数,我觉得你说的不对
时间: 2023-10-15 10:03:54 浏览: 211
JavaScript回调(callback)函数概念自我理解及示例
如果你按照我的建议设置了 `interrupt_callback`,但仍然无法进入回调函数,可能有以下几种情况:
1. 相机设备一直在输出数据,没有导致 FFmpeg 的读取操作超时。你可以尝试暂停相机设备的输出,或者通过设置 `AVFormatContext` 的 `max_delay` 成员变量来强制超时。例如:
```c
fmt_ctx->max_delay = 5000; // 设置最大延迟时间为 5 秒
```
2. `interrupt_callback` 没有被正确设置。请确保你在打开相机设备之后立即设置 `interrupt_callback`。并且在回调函数中正确地返回超时状态。你可以尝试在回调函数中添加一些调试信息,以便确定是否进入了回调函数。例如:
```c
int interrupt_callback(void *ctx)
{
AVFormatContext *fmt_ctx = (AVFormatContext *)ctx;
int64_t current_time = av_gettime();
int64_t timeout = fmt_ctx->interrupt_callback.opaque;
printf("interrupt_callback: current_time=%lld, start_time=%lld, timeout=%lld\n", current_time, fmt_ctx->start_time, timeout);
if (current_time - fmt_ctx->start_time >= timeout) {
printf("interrupt_callback: timeout\n");
return 1; // 超时
}
return 0;
}
```
3. `av_read_frame` 函数没有被正确调用。请确保你在正确的上下文中调用了 `av_read_frame` 函数,并且没有被其他操作阻塞。你可以在调用 `av_read_frame` 函数之前添加一些调试信息,以便确定是否进入了该函数。例如:
```c
printf("before av_read_frame\n");
ret = av_read_frame(fmt_ctx, &pkt);
printf("after av_read_frame, ret=%d\n", ret);
```
如果你仍然无法解决问题,请提供更多的代码和上下文信息,以便我更好地帮助你。
阅读全文