Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FFMPEG libx265编码在avcodec_free_上下文后使内存不缠绕_C_Video_Encoding_Ffmpeg_Libx265 - Fatal编程技术网

FFMPEG libx265编码在avcodec_free_上下文后使内存不缠绕

FFMPEG libx265编码在avcodec_free_上下文后使内存不缠绕,c,video,encoding,ffmpeg,libx265,C,Video,Encoding,Ffmpeg,Libx265,我正在开发H265编码软件,在我的单元测试中,我有一些奇怪的内存泄漏。为了找到它们,我修改了中的encode\u video.c示例。我更改了分辨率以对应4K视频,调整了比特率,并在上下文分配之前添加了一个暂停,在最终返回之前添加了另一个暂停: #包括 #包括 #包括 #包括 #包括 #包括 #包括 静态无效编码(AvcodeContext*enc_ctx、AVFrame*frame、AVPacket*pkt、, 文件*输出文件) { int ret; /*将帧发送到编码器*/ 如果(帧) pr

我正在开发H265编码软件,在我的单元测试中,我有一些奇怪的内存泄漏。为了找到它们,我修改了中的
encode\u video.c
示例。我更改了分辨率以对应4K视频,调整了比特率,并在上下文分配之前添加了一个暂停,在最终返回之前添加了另一个暂停:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
静态无效编码(AvcodeContext*enc_ctx、AVFrame*frame、AVPacket*pkt、,
文件*输出文件)
{
int ret;
/*将帧发送到编码器*/
如果(帧)
printf(“发送帧%3”PRId64“\n”,帧->pts);
ret=avcodec_发送_帧(enc_ctx,帧);
如果(ret<0){
fprintf(stderr,“发送编码帧时出错”);
出口(1);
}
而(ret>=0){
ret=avcodec_接收_数据包(enc_ctx,pkt);
如果(ret==AVERROR(EAGAIN)| | ret==AVERROR_EOF)
返回;
否则如果(ret<0){
fprintf(stderr,“编码过程中出错\n”);
出口(1);
}
printf(“写入数据包%3”PRId64(大小=%5d)\n”,pkt->pts,pkt->size);
fwrite(pkt->data,1,pkt->size,outfile);
av_-packet_-unref(pkt);
}
}
int main(int argc,字符**argv)
{
常量字符*文件名,*编解码器名称;
const AVCodec*编解码器;
AVCodecContext*c=NULL;
int i,ret,x,y;
文件*f;
AVFrame*frame;
AVPacket*pkt;
uint8_t endcode[]={0,0,1,0xb7};
如果(argc比特率=1000000;
/*分辨率必须是2的倍数*/
c->宽度=3840;
c->高度=2160;
/*每秒帧数*/
c->time_base=(AVRational){1,25};
c->帧率=(AVRational){25,1};
/*每十帧发射一帧内图像
*在通过机架前检查机架图片类型
*对于编码器,如果帧->图片类型是AV图片类型
*然后忽略gop_大小,编码器输出
*无论gop_的大小,都将始终是I帧
*/
c->gop_尺寸=10;
c->max_b_frames=1;
c->pix_fmt=AV_pix_fmt_YUV420P;
如果(编解码器->id==AV\U编解码器\U id\U H264)
av_opt_set(c->priv_数据,“预设”,“慢速”,0);
/*打开它*/
ret=avcodec_open2(c,codec,NULL);
如果(ret<0){
fprintf(stderr,“无法打开编解码器:%s\n”,av_err2str(ret));
出口(1);
}
f=fopen(文件名,“wb”);
如果(!f){
fprintf(stderr,“无法打开%s\n”,文件名);
出口(1);
}
frame=av_frame_alloc();
如果(!帧){
fprintf(stderr,“无法分配视频帧”\n);
出口(1);
}
帧->格式=c->pix\U fmt;
框架->宽度=c->宽度;
框架->高度=c->高度;
ret=av\U帧\U get\U缓冲区(帧,0);
如果(ret<0){
fprintf(stderr,“无法分配视频帧数据”);
出口(1);
}
/*编码1秒的视频*/
对于(i=0;i<25;i++){
fflush(stdout);
/*确保帧数据是可写的*/
ret=av_帧_使_可写(帧);
如果(ret<0)
出口(1);
/*准备一个虚拟图像*/
/*Y*/
对于(y=0;yheight;y++){
对于(x=0;xwidth;x++){
帧->数据[0][y*帧->线宽[0]+x]=x+y+i*3;
}
}
/*Cb和Cr*/
对于(y=0;yheight/2;y++){
对于(x=0;xwidth/2;x++){
帧->数据[1][y*帧->线宽[1]+x]=128+y+i*2;
帧->数据[2][y*帧->线宽[2]+x]=64+x+i*5;
}
}
帧->pts=i;
/*对图像进行编码*/
编码(c,帧,pkt,f);
}
/*冲洗编码器*/
编码(c,NULL,pkt,f);
/*添加序列结束代码以获得真正的MPEG文件*/
如果(编解码器->id==AV_编解码器(id)MPEG1视频| |编解码器->id==AV_编解码器(id)MPEG2视频)
fwrite(endcode,1,sizeof(endcode),f);
fclose(f);
avcodec_free_上下文(&c);
av_无帧(&帧);
av_数据包免费(&pkt);
睡眠(10);
返回0;
}
我原以为第一次暂停时的RAM内存使用量与第二次暂停时相同,但相差约55个月。如果我增加编码帧的数量,这一差异将达到390个月。我已经在Linux Mint LMDE 4(与Debian 10大致相同)下测试了这段代码


我猜这个内存“泄漏”不是真正的内存泄漏,而是libx265使用的一些内部值,可能会被重新用于另一种编码。但是有没有办法通过FFMPEG API释放这个内存?

unref循环中的AVPacket。这已经在第37行的
encode
函数中完成了