[记录一个bug]ffmpeg从GPU拷贝至CPU编码崩溃及Input picture width (x) is greater than stride (0)[已解决]

从显卡拷贝到CPU出现了一个错误

导致av_hwframe_transfer_data(dst_frame, src_frame, 0) 直接崩溃

首先还是明确一点,肯定是要拷贝到CPU的,所以这个函数得调,那么流程没错了,就是参数问题了

去参考了解码的,也是从显卡拷贝到CPU,发现不像从CPU拷贝到显卡,需要给dst_frame使用av_hwframe_get_buffer指定一个buffer。最后发现是dst_frame未初始化 ̄□ ̄

解决了之后,后续还有错误编码失败

[libx264 @ 0x7fff940043c0] Input picture width (176) is greater than stride (0)

 思考了一下,本来从CPU的resize 里传递过来的frame是可以的过来正常编码的

但是由于这次resize改用了GPU的,所以出现了这个问题。

百度了一下,应该是某处参数不对,该初始化的都初始化了,还是没找到问题,思考了一下pix_fmt的传递

我这次的传递的想法是这样的

解码>cuda>resize>yuv420>编码>yuv420

但是思考了一下是不是从GPU出来的帧没法转成yuv420,因为网上也有说法是GPU出来只出NV12

那这样我的想法就错了,要修改为:

解码>cuda>resize>nv12>编码>yuv420

修改编码encctx->pix_fmt=AV_PIX_FMT_NV12,

顺便encctx->sw_pix_fmt=AV_PIX_FMT_YUV420P(个人认为这个是转换后的格式)

编译后成功!

题外话:

 有个疑惑,GPU出来的帧src_frame,在初始化src_frame设置avpicture_fill时,如果写成了NV12,那么即使编码出来后的视频,在ffplay上显示是NV12。如果写成了YUV420,那么ffplay播放显示的就是YUV420。怎么跟上面encctx设置的pix_fmt没啥关系?

av_hwframe_transfer_data(dst_frame, src_frame, 0);

avcodec_send_frame(enc_context, dst_frame);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值