FFmpeg c api 为 AV_CODEC_ID_H264 在 Windows 上崩溃创建编码器

问题描述 投票:0回答:1

我正在使用 ffmpeg(5.1.2 版)每帧剪辑一个 mp4 视频,因此我需要对其进行解码和编码。但是,当我为其视频流创建编码器时,程序总是在调用

avio_open2()
时崩溃,在 H264 给出此错误消息后:

[h264_mf @ 0000025C1EBC1900] could not set output type (80004005)

编码器的codec context的配置(time_base, pix_fmt, width, height)是从解码器复制过来的,我通过查找是否在

codec->pix_fmts
中来检查是否支持像素格式。

我发现这个问题并不涉及我所有的其他代码,因为这个最小的程序可以重复同样的问题:

extern "C"
{
#include <libavcodec/avcodec.h>
}

int main()
{
    auto codec = avcodec_find_encoder(AV_CODEC_ID_H264);
    auto codec_ctx = avcodec_alloc_context3(codec);

    codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P;
    codec_ctx->width = 2560;
    codec_ctx->height = 1440;
    codec_ctx->time_base.num = 1; codec_ctx->time_base.den = 180000;

    avcodec_open2(codec_ctx, codec, NULL);

    return 0;
}

然后怀疑是不是ffmpeg的bug。我的环境是Windows 11 64位,Visual Studio 2022,ffmpeg库是从vcpkg获取的,如下图:

c++ visual-studio ffmpeg h.264 vcpkg
1个回答
0
投票

发现问题是时基太小引起的

更具体的,我测试过,假设分子为1,当分母<= 172, the encoder can be created with no problem. When denominator >172时,然而,问题总是会出现。

我觉得很奇怪,因为时间基准是直接从解码器中复制的,它是直接从流设置中复制的。也就是说,至少 H264 可以使用这个时基来编码视频。我不明白为什么 ffmpeg 找到的这个特定编码器不支持它,但至少我可以继续我的工作。

编辑:我在

AVCodecContext::time_base
的评论中发现,为了解码它已被弃用,我应该为此目的使用帧率(即将流的
r_frame_rate
复制到
codec_ctx->framerate
)。该值为 30/1,其倒数大于极限 1/172。但是,对于编码,它是必须设置的,这(有点)是我困惑的原因。

© www.soinside.com 2019 - 2024. All rights reserved.