c++ - ffmpeg:avcodec_open2 返回无效参数

标签 c++ ffmpeg

我在我的应用程序中重复使用 FFmpeg 开发人员 64 位版本的示例代码来编码视频:

AVCodec* pCodec_{nullptr};
AVCodecContext* pContext_{nullptr};

avcodec_register_all();
pCodec_ = avcodec_find_encoder(AV_CODEC_ID_MPEG2VIDEO);
if (!pCodec_) {}

pContext_ = avcodec_alloc_context3(pCodec_);
if (!pContext_) {}

pContext_->bit_rate = 400000;
pContext_->width = size.width();
pContext_->height = size.height();

pContext_->time_base.den = 1;
pContext_->time_base.num = fps;

pContext_->gop_size = 10;
pContext_->max_b_frames = 1;
pContext_->pix_fmt = AV_PIX_FMT_BGR0;

if (codec_id == AV_CODEC_ID_H264) {
    av_opt_set(pContext_->priv_data, "preset", "slow", 0);
}

int err = avcodec_open2(pContext_, pCodec_, nullptr);
if (err < 0) {}

AVCodec*AVCodecContext* 看起来它们被正确分配了。 avcodec_open2 然后返回无效参数 (-22)。

我使用:Windows 10 64、VS2013 编译器、Qt Creator IDE、ffmpeg(2016-05-12) 64 位。

我从中获取代码的示例是 decoding_encoding.c .

有什么想法吗?

最佳答案

只是一些想法:

  • 看看这个:FFMPEG - format not available?似乎 ffpmeg 希望您设置编码器本身支持的 pix_fmt。
  • 你的时间基准似乎很奇怪。我猜应该是1/fps,不是fps/1
  • 玩比特率。我依稀记得,至少在几年前,这个值应该以 kbit/s 或 bit/s 为单位,具体取决于编解码器。 (对于 mpeg2,400 kbit/s 也很低,但我想它应该仍然可以工作)。
  • 对于第一次测试,使用 720 × 480 等标准分辨率。IIRC mpeg2 仅支持某些分辨率,至少两个尺寸都必须是 8 的倍数。

关于c++ - ffmpeg:avcodec_open2 返回无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37185497/

相关文章:

c++ - 牡丹 AES-256,32 位 InitialVector

c++ - exception_handling_C++_xcode

c++ - 当与错误检查宏一起使用时,具有两个类型参数的模板函数无法编译

batch-file - 如何使用 ffmpeg 将 rmvb 转换为相同质量的 mp4?

video - 使用 ffmpeg 从未压缩的 y4m 视频中提取帧

java - mediaReader.readPacket() 在 Xuggler 中尝试读取 rtsp 流时阻塞

C++11 模板函数别名与包装器

c++ - 如何为从 C++ 中的函数返回的临时对象调用析构函数?

c++ - 我调用了av_probe_input_format3(),现在我想调用avcodec_find_decoder(),如何在编解码器中转换格式?

ffmpeg 混合过滤器如何工作