video - 如果图像数量小于 GOP 大小,如何使用 ffmpeg 进行编码

标签 video ffmpeg mp4 libavcodec

下面的代码从 jpeg 图像创建 mp4 视频文件。当图像数量大于 GOP 大小时,编码成功并且在 avcodec_encode_video2 返回的第 10 个图像 gotPacket 之后 > 0。

但是当图像数量小于 GOP 大小时,gotPacket 始终 = 0,因此没有图像写入文件。

我的猜测是 avcodec_encode_video2 分配长度等于 GOP 大小的缓冲区,直到它不满 gotPacket 将为 0。

我的问题是即使缓冲区未满,如何强制 avcodec_encode_video2 进行编码?

...
_outStream->codec.gop_size = 10;
_outStream->codec.keyint_min = 10;
...

AVFrame* frame = getFrame();


AVPacket packet;
av_init_packet(&packet);
packet.data = NULL;
packet.size = 0;

int gotPacket = 0;
if (avcodec_encode_video2(_outStream->codec, &packet, frame, &gotPacket) < 0)
    throw std::runtime_error("failed to encode frame");

if (gotPacket)
{
    ...
    if (av_write_frame(_outContainer.get(), &packet) < 0)
        throw std::runtime_error("failed to write frame");      
    av_free_packet(&packet);
}

最佳答案

我找到了解决方案。如果我们将 NULL 作为要编码的原始视频数据(第三个参数)传递,它将导致编码器刷新缓冲区
if (avcodec_encode_video2(_outStream->codec, &packet, NULL, &gotPacket)

关于video - 如果图像数量小于 GOP 大小,如何使用 ffmpeg 进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923276/

相关文章:

WordPress:媒体错误:不支持格式或未找到来源

video - FFMpeg:在保持纵横比的同时以最大宽度和高度缩小视频

c++ - openCV:如何将视频分割成图像序列?

python - 如何在使用 subprocess.Popen 并同时隐藏 cmd 窗口时设置输出文件?

HTML5 视频在我的服务器上托管时无法播放,但从外部源播放正常

c++ - 如何以编程方式使用 ffmpeg faststart 标志?

video - 如何使用 GNURadio 和 USRP 发送视频文件?

ios - 视频标签在 iPhone Safari 或 Chrome 和某些 iPad 上不起作用

bash - 使用 bash 循环浏览目录中的文件,然后根据文件名创建子目录

c++ - FFmpeg 为第一个非关键帧返回负 PTS 和 DTS