我正在使用FFmpeg将视频帧写入文件。
到目前为止,我能够创建一个输出文件,从相机中获取帧,对帧进行编码,写入并关闭输出文件。
一切都很好,除了我需要关闭我的程序以使输出文件可以播放。关闭文件是不够的。
如果我不关闭程序,输出文件显示为0KB文件。
这是我的输出文件关闭代码:
if (outContext)
{
int ret = av_write_frame(outContext, NULL);
ret = av_write_trailer(outContext);
if (outContext->pb)
{
av_freep(&outContext->pb->buffer);
av_freep(&outContext->pb);
avio_close(outContext->pb);
}
avformat_free_context(outContext);
}
我忘了释放/关闭任何东西吗?
答案 0 :(得分:2)
我可以列举一些可能的改进:
1)没有必要使用这行代码:
int ret = av_write_frame(outContext, NULL);
因为av_write_trailer
会刷新所有缓冲的数据包。
2)这两行:
av_freep(&outContext->pb->buffer);
av_freep(&outContext->pb);
是多余的,因为它们部分重复avio_close
功能。
实际上,最可能的原因是avio_close
需要一个指向AVIOContext
的有效指针作为参数。当您手动执行
av_freep(&outContext->pb);
outContext->pb
变为空,avio_close
无效。