在我目前的工作中,我正在尝试使用 FFMPEG 的 C 库将一些图像编码为 h264 视频。生成的视频在 VLC 中播放良好,但没有预览图像。视频可以在 ubuntu 上的 VLC 和 Mplayer 中播放,但不能在 Mac 或 PC 上播放(事实上,它会导致 Mac 上出现“VTDecoderXPCService quit unexpectedly”错误)。
如果我使用命令行通过 FFMPEG 运行生成的文件,则生成的文件有一个预览图像,并且可以在任何地方正确播放。
显然,我从程序中取出的文件在某个奇怪的地方损坏了,但是在编译或运行期间我没有任何输出来指示位置。我目前无法分享我的代码(工作代码尚未开源 :-( ),但我尝试了很多方法:
- 只写入头和尾数据 (av_write_trailer),不写入帧
- 只写帧减去预告片(使用 avcodec_encode_video2 和 av_write_frame)
- 调整我们的 time_base 和 frame pts 值以每秒仅编码一帧
- 删除所有可变帧率代码
- 我不会在这里打扰您的许多其他变体
在创建我的项目时,我还遵循了以下教程:
并查阅了已弃用的 ffmpeg 函数列表
并根据官方文档在ubuntu上编译FFMPEG
并咨询了许多 StackOverflow 问题:
- 使用 libavcodec 的 mpegts 容器中的原始 H264 帧
- 如何使用 MediaCodec 将位图编码为视频?
- 如何将 YUV420p 的 RGB 转换为 ffmpeg 编码器?
- 使用 FFmpeg C API 编码 H.264 视频
- ffmpeg:如何将 h264 原始数据保存为 mp4 文件
但是程序的每次运行都会遇到完全相同的问题。
我的问题是,是否有任何明显的原因导致 FFMpeg 的编程运行与控制台运行不同(例如,不完整的最终确定、一些线程问题等)?就像控制台运行可以修复损坏的文件的一些明显原因一样?或者是否有一个不错的工具/方法来检查视频文件并找到损坏点?