[英]How to encode H.264 video using FFmpeg C API and then open the output with a media player?
[英]FFmpeg API example (encode_video.c) does not work correctly
我正在使用官方encode_video.c示例来测试 FFmpeg 是否适合我。 我从ffmpeg.zeranoe.com/builds获得了预构建的 windows 版本。 它已经使用 libx264 和其他外部库构建。 我同时获得了开发版和共享版,并在 Visual Studio 中相应地添加了 DLL、header 文件和库。
现在 encode_video.c 示例无法正常工作。
我尝试了什么:
我编译了示例并在许多不同的文件格式和编解码器上运行它,如下所示。
首先,我尝试了所有这些文件格式(.mp4、.m4v、.h264、.x264、.avi、.flv),编解码器名称为 libx264。 代码执行无误,但 output 视频文件未在 VLC 或 Windows 10 默认播放器中播放。
接下来,我尝试了上述所有文件格式,但编解码器名称为 mpeg4。 代码执行无误,但 output 视频文件仅在 VLC 中播放.m4v 。
什么是预期的:
所有这些组合都应该产生一个可以在 VLC 中播放的视频文件。 除了.m4v作为文件格式和mpeg4作为编解码器名称外,它们都不起作用。
请告诉我如何使它适用于 h264。 我主要希望它适用于 h264,因为这只是目前重要的。
我正在运行类似./encode_video.exe test.mp4 libx264
的代码,其中第一个参数是 output 文件名,第二个参数是编解码器名称。
这是用于 test.mp4 和 libx264 的 output 作为命令行 arguments https://imgur.com/a/AHLQwuK
似乎在encode
function 中,它遍历下面的代码并由于 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 已正确链接。 请帮我弄清楚现在的问题是什么!!
我发现这个问题是因为我遇到了同样的问题(无法观看该示例生成的视频)。 关于您的担忧:
似乎在编码 function 中,由于 AVERROR(EAGAIN) 或 AVERROR_EOF,它会遍历以下代码并返回。 请告诉我发生了什么。
在调试器中单步执行代码时,我也注意到了那些偶尔出现的“错误”。 但是,这些帧最终会在随后的循环迭代中或在编码器通过以下方式闪烁时进行处理:
/* flush the encoder */
encode(c, NULL, pkt, f);
我也尝试使用 VLC 和 QuickTime,但没有成功。
然后我注意到 ffmpeg 的 bin 文件夹中的 ffplay 工具,它可以播放该示例生成的所有视频,使用不同的编解码器。
我的观点是——问题可能出在观众身上,而不是视频文件上。
只是改变:
./encode_video.exe test.mp4 libx264
至:
./encode_video.exe test.264 libx264
结果文件“test.264”可以通过vlc播放器播放。
我在我的 Mac 上运行 ffmpeg 的 encode_video.c 演示,Apple 的 QuickTime Player 似乎不支持这种格式。
您想要改用 muxing.c 示例。
encode_video 示例不生成 MPEG 兼容文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.