【发布时间】: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