c++ - FFmpeg API 示例 (encode_video.c) 无法正常工作

标签 c++ c video ffmpeg video-encoding

我用的是官方encode_video.c测试 FFmpeg 是否适合我的示例。 我从 ffmpeg.zeranoe.com/builds 获得了预构建的 Windows 版本.它已经使用 libx264 和其他外部库构建。我得到了开发版和共享版,并在 Visual Studio 中相应地添加了 DLL、头文件和库。

现在 encode_video.c 示例无法正常工作。


我尝试了什么:

我编译了示例并在许多不同的文件格式和编解码器上运行它,如下所示。

首先,我尝试了所有这些文件格式(.mp4、.m4v、.h264、.x264、.avi、.flv),编解码器名称为 libx264。代码执行无误,但输出视频文件无法在 VLC 或 Windows 10 默认播放器中播放。

接下来,我尝试了上述所有文件格式,但编解码器名称为 mpeg4。代码执行无误,但输出视频文件仅在 VLC 中播放 .m4v


预期的结果:

所有这些组合都应该产生一个可以在 VLC 中播放的视频文件。除了作为文件格式的 .m4v 和作为编解码器名称的 mpeg4 之外,它们都不起作用。


请告诉我如何使它适用于 h264。我主要希望它适用于 h264,因为目前这很重要。

我正在运行类似 ./encode_video.exe test.mp4 libx264 的代码,其中第一个参数是输出文件名,第二个参数是编解码器名称。

这是作为命令行参数的 test.mp4 和 libx264 的输出 https://imgur.com/a/AHLQwuK

似乎在 encode 函数中,它遍历了下面的代码并由于 AVERROR(EAGAIN) 或 AVERROR_EOF 而返回。请告诉我发生了什么。

while (ret >= 0) {
        ret = avcodec_receive_packet(enc_ctx, pkt);
        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
            return;
        else if (ret < 0) {
            fprintf(stderr, "Error during encoding\n");
            exit(1);
        }

        printf("Write packet %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size);
        fwrite(pkt->data, 1, pkt->size, outfile);
        av_packet_unref(pkt);
    }

我使用 DepenciesGUI 找出链接的 DLL,它显示 DLL 已正确链接。请帮我弄清楚现在的问题是什么!!

最佳答案

我发现这个问题是因为我遇到了同样的问题(无法观看该示例生成的视频)。关于您的问题:

It seems that in the encode function, it goes over the below code and returns because of AVERROR(EAGAIN) or AVERROR_EOF. Please tell me what is happening.

在调试器中逐步执行代码时,我也注意到了那些偶尔出现的“错误”。但是,这些帧最终会在随后的循环迭代中或在通过以下方式闪烁编码器时进行处理:

/* flush the encoder */
encode(c, NULL, pkt, f);

我也尝试过使用 VLC 和 QuickTime,但没有成功。

然后我注意到 ffmpeg 的 bin 文件夹中的 ffplay 工具,它可以播放该示例使用不同编解码器生成的所有视频。

我的观点是 - 问题可能出在观众身上,而不是视频文件上。

关于c++ - FFmpeg API 示例 (encode_video.c) 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62086640/

相关文章:

c - 如何确定 C 中复合文字数组中有多少个元素?

javascript - 视频请求中缺少范围 header ?

video - 如何使用 libav 修复视频中的卡住像素?

c++ - 这两种不是同一种类型吗?

c++ - std::enable_if 有条件地编译一个成员函数

c - 运行时错误 : Singly Link List program to insert a value

c - 冒泡排序逻辑,迭代次数

c++ - 对类型的非常量左值引用无法绑定(bind)错误

c++ - 是否有任何标准方法可以将调试打印放入库中?

html - 嵌入 Vimeo 播放器故障