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

时间:2013-04-10 10:26:47

标签: 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);
}

1 个答案:

答案 0 :(得分:2)

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

if (avcodec_encode_video2(_outStream->codec, &packet, NULL, &gotPacket)