我使用FFMPEG通过RTSP流连接到IP摄像机。我试图检测连接是否丢失。我使用interrupt_callback创建超时,并检查av_read_frame()的输出,有时它工作并可以重新连接到摄像头。但是,如果我禁用相机(拔下网线),它会被阻止并永久停顿。 希望有人有类似的问题,可以帮助我。 我在这里尝试:
设置interrupt_callback:
ifmt_ctx = avformat_alloc_context();
ifmt_ctx->interrupt_callback.callback = interruptCallback;
ifmt_ctx->interrupt_callback.opaque = this;
if ((ret = avformat_open_input(&ifmt_ctx, in_file, 0, &options)) != 0) {
log.error("Could not open input stream {}", in_file);
return 1;
}
interrupt_callback功能:
int CtFfmpeg::interruptCallback(void *ctx)
{
CtFfmpeg* camera = reinterpret_cast<CtFfmpeg*>(ctx);
struct tm *tm;
time_t now;
now = time(0);
tm = localtime (&now);
int nowTime_callback = tm->tm_sec;
if ((nowTime_callback - camera->initTime_callback) > 15) { //Timeout after 20 seconds
Logger log{__func__};
log.error("Time out");
return 1;
}
return 0;
}
尝试重新启动连接:
ff->ret = av_read_frame(ff->ifmt_ctx, &(ff->tmp_pkt));
if (ff->ret < 0){
// do restart here
}