从显卡拷贝到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);