下面的代码从 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);
}