首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AVFormatContext:中断回调是否正确使用?

AVFormatContext:中断回调是否正确使用?
EN

Stack Overflow用户
提问于 2021-07-16 19:07:44
回答 1查看 621关注 0票数 0

AVFormatContext的interrupt_callback字段

自定义中断回调的I/O层。

它的类型是AVIOInterruptCB,它在注释部分解释:

回调,用于检查是否中止阻塞函数。

在这种情况下,AVERROR_EXIT由中断的函数返回。在阻塞操作期间,以不透明作为参数调用回调。如果回调返回1,则阻塞操作将被中止。

如果在AVFormatContext或AVIOContext中在此结构之后添加了新元素,则无法在此结构中添加任何成员。

我有两个问题:

  1. 最后一节是什么意思?特别是“没有重大冲击”?
  2. ,如果我将它与RTSP源代码一起使用,当我关闭avformat_close_input的输入时,就会发出"TEARDOWN“消息,但是它不会到达RTSP服务器.

对于2:下面是演示的快速伪代码:

代码语言:javascript
复制
int pkts = 0;
bool early_exit = false;

int InterruptCallback(void* ctx) {
    return early_exit ? 1 : 0;
}

void main() {
  ctx = avformat_alloc_context
  ctx->interrupt_callback.callback = InterruptCallback;

  avformat_open_input
  avformat_find_stream_info
  pkts=0;
  while(!early_exit) {
    av_read_frame

    if (pkts++ > 100) early_exit=true;
  }

  avformat_close_input
}

如果我根本不使用中断回调,就会发出TEARDOWN,并且它也会到达RTSP服务器,这样它就可以实际地断开连接。否则,它不会拆除它,我不得不等到TCP套接字超时。

使用这个中断回调的正确方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2021-07-17 11:16:57

  1. --这意味着他们不会为这个结构(AVIOInterruptCB)改变任何东西。然而,如果是这样的话,它将是一个大的凸起(主要变化从4.4到5.0)

  1. 您需要传递一个有意义的参数来使* ctx无效。任何你喜欢的东西,所以你可以在静态函数中检查它。例如,您将设置为cancel的bool,因此您将中断av_read_frame (这将返回一个AVERROR_EXIT)。通常,您传递一个类的解码器上下文或类似的东西,这也保存了所有的信息,您需要检查是否返回1中断或0,以继续正确的请求。一个实际的例子是,您打开了一个错误的rtsp,然后您想要打开另一个(正确的),所以您需要取消先前的请求。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68414179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档