我已经搜索了一个简单的例子,说明如何在Windows中使用ffmpeg来解码硬件加速的H264流,但是我找不到。我知道我应该使用dxva2和ffmpeg来加速硬件。
我可以在CPU上用ffmpeg解码H264,然后将NV12格式转换为post格式,并将帧保存为bmp文件,这要感谢post中提供的示例项目。
为了获得关于dxva2的帮助,我遵循了以下文章中提供的内容:post
我相信我可以用dxva2成功地解码;但是,当我想要得到解码的帧并将其转换为RGBA格式并将其保存为bmp文件时,我会得到一个关于源指针的错误。
我解码和检索帧如下:
int videoFrameBytes = avcodec_decode_video2(pCodecCtx_hwaccel, pFrameYuv, &got_picture_ptr, avpkt);
if (got_picture_ptr==1)
{
if(dxva2_retrieve_data_call(pCodecCtx_hwaccel, pFrameYuv) == 0)
{
fprintf(stderr, "Got frame successfully\n");
result = true;
}
}并将输出帧输入到:
sws_scale(pImgConvertCtx, pFrameYuv->data, pFrameYuv->linesize, 0, height, frame->data, frame->linesize); 我知道这个错误:
swscaler @ 030c5c20坏的src图像指针
显然,pFrameYuv->data有问题,但我不知道是什么。
如何将用DXVA2解码的NV12帧转换为用sws_scale解码的RGBA?
发布于 2016-06-23 13:56:32
问题解决了。
这是由于像素格式类型不正确造成的。在创建sws_context时,我使用了编解码器上下文的像素格式,如下所示:(这对于SW解码是可以的)
// initialize SWS context for software scaling
sws_ctx = sws_getContext(pCodecCtx->width,
pCodecCtx->height,
pCodecCtx->pix_fmt,
pCodecCtx->width,
pCodecCtx->height,
AV_PIX_FMT_RGB24,
SWS_BILINEAR,
NULL,
NULL,
NULL
);pCodecCtx->pix_fmt为AV_PIX_FMT_YUV420P,而解码后的帧格式为AV_PIX_FMT_NV12 + DXVA2。设置正确的格式后,我可以使用sws_scale将NV12帧转换为RGB。
正确参数:
// initialize SWS context for software scaling
sws_ctx = sws_getContext(pCodecCtx->width,
pCodecCtx->height,
AV_PIX_FMT_NV12,
pCodecCtx->width,
pCodecCtx->height,
AV_PIX_FMT_RGB24,
SWS_BILINEAR,
NULL,
NULL,
NULL
);另外,请注意取消输出检索帧,如下所示:
av_frame_unref(pFrameYuv);否则你就会有内存泄漏。
此外,正如post中所述,dxva2_retrieve_data_call效率很低。您应该寻找从GPU获取数据的另一种方法。
https://stackoverflow.com/questions/37963492
复制相似问题