C 如何避免不支持的帧速率错误?

C 如何避免不支持的帧速率错误?,c,ffmpeg,camera,d,frame-rate,C,Ffmpeg,Camera,D,Frame Rate,我在Macbook上,我正在尝试使用ffmpeg库从相机读取视频。该摄像机为10米USB水下摄像机。我通过名为ffmpeg-D的D绑定使用C API。 但是,在尝试打开输入时,我得到以下结果: [avfoundation @ 0x7fe0d2800000] Selected framerate (29.970030) is not supported by the device [avfoundation @ 0x7fe0d2800000] Supported modes: [avfoundat

我在Macbook上,我正在尝试使用ffmpeg库从相机读取视频。该摄像机为10米USB水下摄像机。我通过名为ffmpeg-D的D绑定使用C API。 但是,在尝试打开输入时,我得到以下结果:

[avfoundation @ 0x7fe0d2800000] Selected framerate (29.970030) is not supported by the device
[avfoundation @ 0x7fe0d2800000] Supported modes:
[avfoundation @ 0x7fe0d2800000]   160x120@[30.000030 30.000030]fps
[avfoundation @ 0x7fe0d2800000]   176x144@[30.000030 30.000030]fps
[avfoundation @ 0x7fe0d2800000]   320x240@[30.000030 30.000030]fps
[avfoundation @ 0x7fe0d2800000]   352x288@[30.000030 30.000030]fps
[avfoundation @ 0x7fe0d2800000]   640x480@[30.000030 30.000030]fps
那么我怎样才能避免这个问题呢?手动设置帧速率是答案吗?如果是这样,我怎么能做到呢

这里有一个很短的程序来复制我的问题

import std.stdio;

import ffmpeg.libavdevice.avdevice;
import ffmpeg.libavcodec.avcodec;
import ffmpeg.libavformat.avformat;
import ffmpeg.libavfilter.avfilter;
import ffmpeg.libavutil.avutil;
import ffmpeg.libavutil.mem;
import ffmpeg.libavutil.pixfmt;
import ffmpeg.libswscale.swscale;

import std.string;

void main()
{
    av_register_all();
    avdevice_register_all();

    string           cameraSource        = "USB";

    AVCodecContext*  cameraCodecContext  = null;
    AVFormatContext* cameraFormatContext = avformat_alloc_context();
    AVCodec*         cameraCodec         = null;
    AVInputFormat*   cameraFormat        = av_find_input_format("avfoundation");
    AVFrame*         rawFrame = null, convertedFrame = null;

    if (avformat_open_input(&cameraFormatContext, cameraSource.toStringz, cameraFormat, null) != 0) return;
}

我对D或使用中的库没有任何经验,但我可以为您指出正确的方向。您应该将
AVDictionary**options
传递给

选项一个包含
AVFormatContext
和解复用器专用选项的字典。返回时,此参数将被销毁并替换为包含未找到选项的dict。可能为空


在我看来,该词典的结构几乎遵循命令行选项的1:1,因此您应该在键“framerate”下添加值“30”。

如果您手动将大小和帧速率指定为此处列出的值,是否有效?6个月前,ffmpeg程序中有一个类似的错误,但如果您指定大小和帧速率:@WebFreak001 Nice,他们可以修复它
ffmpeg-f avfoundation-video_size 640x480-framerate 30-i“USB”out.png
works。如何在API中复制它?请看一看。虽然不是D,但似乎应该传递某种指定帧率的
av_dict
(指针),而不是
null
。我认为,它相当于命令行界面。看,现在您添加了一些代码,对于从未使用过上述API的人来说,答案非常明显。投了赞成票。嗯,这篇博文的发现很好。它确实有效。我之前试过使用字典,但只使用了函数avformat\u find\u stream\u info(因为谷歌上的搜索提示了这一点)。我想我只是在谷歌方面运气不太好。无论如何,非常感谢。