【问题标题】:FFmpeg API example (encode_video.c) does not work correctlyFFmpeg API 示例 (encode_video.c) 无法正常工作
【发布时间】:2020-09-17 01:31:12
【问题描述】:

我正在使用官方的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 已正确链接。请帮我弄清楚现在是什么问题!

【问题讨论】:

  • 我在这里看不到任何输出文件。输出文件是否为空?部分正确(例如,第一帧)?彻头彻尾的垃圾?您是否尝试过使用调试器单步执行它以查看它是否采用您期望的代码路径?如果您通过dependencies 运行您的可执行文件,它会在正确的位置找到正确的库吗?
  • 我应该在这里添加一个输出文件吗?输出文件由程序生成,但播放器甚至不播放它。它仅在格式为 .mp4 且编解码器为 libx26 时播放。我看到了一些彩色波浪,这也是其他格式和编解码器应该出现的。而且由于它仅适用于此,我假设它可以正确找到库。
  • 看起来你正试图嵌入一些代码或图片或其他东西。当您在失败案例和成功案例中执行其他调试步骤时会发生什么?
  • 哦,对不起,我只是想用那些空代码块给段落添加分隔符。现在编辑了。
  • 嘿,我已经包含了必要的细节。你现在可以检查一下吗?我使用了dependencygui,还检查了这个程序的调试器并发布了它的输出。 @金属

标签: c++ c video ffmpeg video-encoding


【解决方案1】:

只是改变:

./encode_video.exe test.mp4 libx264 

到:

./encode_video.exe test.264 libx264 

结果文件“test.264”可以通过vlc播放器播放。

我在我的 Mac 上运行 ffmpeg 的 encode_video.c 演示,Apple 的 QuickTime Player 似乎不支持这种格式。

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    我的意思是 - 问题可能出在查看器上,而不是视频文件。

    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多