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

时间:2016-04-04 08:20:17

标签: 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:
[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;
}

1 个答案:

答案 0 :(得分:6)

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

  

选项字典中填充了AVFormatContext和demuxer-private选项。返回时,此参数将被销毁并替换为包含未找​​到选项的dict。可能是NULL。

对我来说,似乎该词典的结构几乎遵循命令行选项1对1,因此您应该添加值" 30"在关键字" framerate"。