avformat_open_input(); 返回值为-5

mac中使用qt做的开发,这里有个问题想请求帮助,avformat_open_input(); 返回值为-5
***下面是我代码
AVFormatContext *pFormatCtx;
AVCodecContext *pCodecCtx;
AVCodec pCodec;
AVDictionary
pOptions = NULL;
//设置编码格式
av_dict_set(&pOptions, "pixel_format", "uyvy422", 0);
//设置分辨率
av_dict_set(&pOptions,"video_size","3264x2448",0);

//设置帧率
av_dict_set(&pOptions,"framerate","30",0);

// 打开摄像头
pFormatCtx = avformat_alloc_context();
AVInputFormat *ifmt = av_find_input_format("avfoundation");

const char* indexs = devId.c_str();
iRet=avformat_open_input(&pFormatCtx,indexs,ifmt,&pOptions);

编译后错误提示*************
[avfoundation @ 0x7fe0a7038000] An error occurred: *** -[AVCaptureDevice_Tundra setActiveVideoMinFrameDuration:] Not supported - Supported ranges: (
"<AVFrameRateRange: 0x600000bc4020 1.00 - 1.00 (1000000 / 1000000 - 1000000 / 1000000)>"
), tried to set maxFrameRate to 30.000031 (1000000 / 30000030)>>>>>>>>>>>>>>avformat_open_input error


我把 av_dict_set(&pOptions,"framerate","30",0);改成 av_dict_set(&pOptions,"framerate","15",0);
编译后错误提示*************
[avfoundation @ 0x7f79fb013200] Selected framerate (15.000000) is not supported by the device
[avfoundation @ 0x7f79fb013200] Supported modes:
[avfoundation @ 0x7f79fb013200] 640x480@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 640x480@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 800x600@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 800x600@[2.500000 20.000000]fps
[avfoundation @ 0x7f79fb013200] 1024x768@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 1024x768@[15.000015 15.000015]fps
[avfoundation @ 0x7f79fb013200] 1280x720@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 1280x720@[10.000000 10.000000]fps
[avfoundation @ 0x7f79fb013200] 1280x960@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 1280x960@[5.000000 5.000000]fps
[avfoundation @ 0x7f79fb013200] 1600x1200@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 1600x1200@[5.000000 5.000000]fps
[avfoundation @ 0x7f79fb013200] 1920x1080@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 1920x1080@[5.000000 5.000000]fps
[avfoundation @ 0x7f79fb013200] 2048x1536@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 2048x1536@[3.750001 3.750001]fps
[avfoundation @ 0x7f79fb013200] 2592x1944@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 2592x1944@[2.500000 2.500000]fps
[avfoundation @ 0x7f79fb013200] 3264x2448@[2.500000 30.000030]fps
[avfoundation @ 0x7f79fb013200] 3264x2448@[1.000000 1.000000]fps
[avfoundation @ 0x7f79fb013200] 3840x2880@[2.500000 10.000000]fps
[avfoundation @ 0x7f79fb013200] 3840x2880@[1.000000 1.000000]fps
avformat_open_input error


我改成av_dict_set(&pOptions,"framerate","1",0);就能出图,但是帧率太低,好卡
编译后提示*************
[avfoundation @ 0x7fdb9105a800] Stream #0: not enough frames to estimate rate; consider increasing probesize

上面的代码要怎么改才能让帧率在15~30,可以avformat_open_input(); 返回值为0,请求解答,谢谢了

还有一点,我使用了两个摄像头做测试,一个带yuy2和mjpg格式的就有这问题,一个只有mjpg格式的就没这问题

引用 皆我百晓生 小程序回应内容作答:
根据您提供的信息,您在使用AVFoundation库的avformat_open_input()函数时遇到了一些问题。根据错误消息,您尝试设置的帧率不受设备支持。

首先,您可以尝试将帧率设置为设备支持的最高值,即30。但是,根据错误消息,设备似乎不支持30帧/秒的帧率。您可以尝试设置为设备支持的其他帧率,例如20或25。

如果您仍然遇到问题,可以尝试增加probesize参数的值。probesize参数用于设置解码器在开始解码之前读取的数据量。增加probesize的值可能会提高帧率的估计准确性。

另外,您还可以尝试使用其他解码器或库来打开摄像头。有时不同的解码器或库可能对设备的支持更好。

最后,如果您仍然无法解决问题,建议您查阅相关文档或向开发社区寻求帮助,以获取更详细的指导和支持。

引自gpt
你的问题与FFmpeg库中的avformat_open_input()函数相关,这个函数用于打开输入流。在你的情况中,它试图打开一个摄像头设备。

你的错误消息显示,你试图设置的帧率(frame rate)不被设备支持。当你试图将帧率设为30时,设备不支持这个帧率。然后,你尝试将帧率设为15,这也是设备不支持的。

设备支持的帧率如下:

你应该尝试设置一个在这个范围内的帧率。例如,你可以尝试将帧率设为“2.5”或“3”,这两个帧率都被设备支持。例如:

av_dict_set(&pOptions,"framerate","2.5",0);

或者:

av_dict_set(&pOptions,"framerate","3",0);

然后,再次尝试运行你的代码,看看是否解决了问题。

试试改一下帧率代码:


av_dict_set(&pOptions, "framerate", "10", 0);

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
你可以尝试将分辨率设置为一个较低的值,例如1280x720,这样可能会让帧率在15~30之间。修改后的代码如下:

// 设置分辨率
av_dict_set(&pOptions,"video_size","1280x720",0);

如果仍然无法满足需求,你可以尝试使用不同的编码格式,或者调整摄像头的设置来获得更高的帧率。


根据你提供的代码和错误信息,问题似乎出在设置摄像头的帧率上。根据错误提示,你选择的帧率值不在摄像头支持的范围内。

首先,你可以根据错误信息中列出的摄像头支持的帧率列表,选择一个接近目标范围的帧率值进行尝试。例如,根据错误信息中的列表,你可以尝试设置帧率为 "10.000000" 或 "20.000000"。

如果你要设置的帧率在摄像头支持的范围内,但仍然返回错误,那可能是因为摄像头硬件或驱动程序的限制。在这种情况下,你可以考虑以下几点:

  1. 尝试使用更低分辨率的设置。某些摄像头可能对较高分辨率下的帧率有限制,降低分辨率可能会提高帧率的可用性。

  2. 检查你的摄像头硬件和驱动程序是否有更新版本。有时,更新驱动程序或固件可以解决某些兼容性问题,并提供更多的帧率选项。

  3. 如果你的目标帧率非常重要,你可以尝试使用其他框架或库,或者搜索特定于 avfoundation 和 macOS 的解决方案。可能有其他方法或技巧可以满足你的需求。

最后,你还可以尝试在 avformat_open_input() 函数调用之前,打印出设置好的 pOptions 字典中的参数,以确保参数被正确设置。

希望这些建议能帮助你解决问题。如果问题仍然存在,请提供更多的信息,例如摄像头型号、操作系统版本和相关库的版本,以便更好地了解你的情况并提供更准确的帮助。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

【以下回答由 GPT 生成】

在这个问题中,avformat_open_input()函数返回了-5的错误码,这通常表示打开输入流时发生了错误。根据错误提示和你的代码,问题可能出现在设置帧率(framerate)时。

首先,我们需要清楚所使用的设备支持哪些帧率。根据错误提示信息,设备支持两种分辨率:640x480和800x600,并且帧率为2.5到30.0之间。现在我们需要找到一个设备支持的帧率来代替原来设置的帧率。

我们可以通过访问设备的属性来获得支持的帧率列表。以下是一个示例代码,实现了从设备获取帧率的功能。

#include <iostream>
#include <vector>
#include <string>
#include <AVFoundation/AVFoundation.h>

int main() {
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSArray *supportedFrameRates = device.activeFormat.videoSupportedFrameRateRanges;

    std::vector<std::pair<float, float>> frameRateList;
    for (AVFrameRateRange *range in supportedFrameRates) {
        frameRateList.push_back(std::make_pair(range.minFrameRate, range.maxFrameRate));
    }

    // 打印支持的帧率列表
    for (const auto &[minRate, maxRate] : frameRateList) {
        std::cout << "Supported frame rate: " << minRate << " - " << maxRate << " fps" << std::endl;
    }

    return 0;
}

上述代码通过AVCaptureDevice类获取设备的默认视频设备,并访问其activeFormat属性获得支持的帧率范围。然后我们将支持的帧率列表打印出来,你可以根据实际情况选择与设备兼容的帧率。

接下来,根据支持的帧率列表更新你的代码。下面是一个示例代码,用新的帧率替换原来的帧率设置代码。

// 查询支持的帧率列表
std::vector<std::pair<float, float>> frameRateList = getSupportedFrameRates();

// 找到设备支持的最大帧率
float maxFrameRate = 0;
for (const auto &[minRate, maxRate] : frameRateList) {
    if (maxRate > maxFrameRate) {
        maxFrameRate = maxRate;
    }
}

// 设置帧率
std::string frameRateStr = std::to_string(maxFrameRate);
av_dict_set(&pOptions, "framerate", frameRateStr.c_str(), 0);

在这个示例代码中,我们首先调用getSupportedFrameRates()函数获取设备的支持帧率列表。然后,我们将列表中的最大帧率赋值给变量maxFrameRate。最后,使用新的帧率来替换原来的帧率设置代码。

需要注意的是,这只是一个示例代码,你需要根据自己的实际情况进行调整和修改。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^