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

  • Post author:
  • Post category:其他




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



版权声明:本文为qq_23282479原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。