发现这个问题是在ffmpeg4之后修复的:
原因在于libavformat文件下的ftp.c文件:
修改方法:加入在TCP控制连接时加入应答代码202:
cpp
static int ftp_features(FTPContext *s)
{
static const char *feat_command = "FEAT\r\n";
static const char *enable_utf8_command = "OPTS UTF8 ON\r\n";
static const int feat_codes[] = {211, 0};
static const int opts_codes[] = {200,202 ,451, 0};
av_freep(&s->features);
if (ftp_send_command(s, feat_command, feat_codes, &s->features) != 211) {
av_freep(&s->features);
}
if (ftp_has_feature(s, "UTF8")) {
int ret = ftp_send_command(s, enable_utf8_command, opts_codes, NULL);
if (ret == 200 || ret == 202)
s->utf8 = 1;
}
return 0;
}
否则的话将会引起的函数调用有:
ftp_status()--->ftp_get_line()----->ftp_getc()------->ffurl_read()------>retry_transfer_wrapper() (avic.c)
具体在ffurl_read()函数中无法退出的原因还没有得出结论
暂时先排查到ffurl_read(),总之引起的原因是状态码列表不存在服务器返回的状态码,该部分的判断在ftp_status()函数:
cpp
if (!code_found) {
if (err >= 500) {
code_found = 1;
result = err;
}
else
{
for (i = 0; response_codes[i]; ++i) {
if (err == response_codes[i]) {
code_found = 1;
result = err;
break;
}
}
}
}