Windows下Video_Codec_SDK的环境配置和简单的硬解码Demo

本文介绍了在Windows环境下,使用Video_Codec_SDK进行H264硬解码的实践过程,包括SDK的下载、环境配置、CUDA要求以及示例工程的运行,通过对比FFMPEG的硬解码方案,强调了Video_Codec_SDK的易用性和高效性能。
最近因为需求以及一直以来觉得CPU解码太傻X,研究了一波硬解码。通过连续三四天不间断的挖坑填坑,大抵总结了网上资料给出的三种操作:
1. 用FFMPEG硬解码完从显存拷回内存,然后就没有然后了,存起来了事。
优点:十分简单,FFMPEG本身就给出了例子,跑就行了。
缺点:从显存拷贝回内存,大多数情况下不如直接用CPU解码,饶了一大圈费力不讨好。
改进方向:研究下显存的处理操作,将显存的数据在显存中处理完后通过D2D、D3D或OpenGL直接显示出来。研究FFMPEG源码的“av_hwframe_transfer_data”函数来实现这一操作应该是个比较好的思路。
2. 用FFMPEG硬解码完从显存拷到D3D中进行显示。
优点:第1种操作的前进方向,性能有质的飞跃。
缺点:
  1. 资料相当少,可以说有用的就是这位老哥给出的操作以及其他抄作业的老哥
以下是一个简化的海思ffmpeg来流结合sample_vdec进行硬解码的示例框架代码,实际应用中需要根据海思SDK以及ffmpeg库的具体情况进行调整。 #### 1. 使用ffmpeg进行来流读取 ```c #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> void read_stream() { AVFormatContext *fmt_ctx = NULL; int ret; // 初始化FFmpeg库 avformat_network_init(); // 打开输入流 ret = avformat_open_input(&fmt_ctx, "your_stream_url", NULL, NULL); if (ret < 0) { // 处理错误 return; } // 查找流信息 ret = avformat_find_stream_info(fmt_ctx, NULL); if (ret < 0) { // 处理错误 avformat_close_input(&fmt_ctx); return; } // 查找视频流 int video_stream_index = -1; for (unsigned int i = 0; i < fmt_ctx->nb_streams; i++) { if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { video_stream_index = i; break; } } if (video_stream_index == -1) { // 未找到视频流 avformat_close_input(&fmt_ctx); return; } AVPacket pkt; while (av_read_frame(fmt_ctx, &pkt) >= 0) { if (pkt.stream_index == video_stream_index) { // 这里将pkt数据传递给海思sample_vdec进行解码 // 示例代码中省略具体的海思解码调用 } av_packet_unref(&pkt); } avformat_close_input(&fmt_ctx); } ``` #### 2. 海思sample_vdec部分(简化示意) ```c #include "hi_comm_vb.h" #include "hi_comm_vdec.h" #include "hi_mpi_vdec.h" void init_vdec() { HI_VOID *pVbConfig; HI_S32 s32Ret; VB_CONF_S stVbConf; // 初始化VB memset(&stVbConf, 0, sizeof(VB_CONF_S)); stVbConf.u32MaxPoolCnt = 128; s32Ret = HI_MPI_VB_SetConfig(&stVbConf); if (HI_SUCCESS != s32Ret) { // 处理错误 return; } s32Ret = HI_MPI_VB_Init(); if (HI_SUCCESS != s32Ret) { // 处理错误 return; } // 设置VDEC模块参数 VDEC_MOD_PARAM_S stModParam; memset(&stModParam, 0, sizeof(VDEC_MOD_PARAM_S)); stModParam.enVbMode = VB_MODE_COMMON; s32Ret = HI_MPI_VDEC_SetModParam(&stModParam); if (HI_SUCCESS != s32Ret) { // 处理错误 HI_MPI_VB_Exit(); return; } // 创建解码通道 VDEC_CHN_ATTR_S stChnAttr; memset(&stChnAttr, 0, sizeof(VDEC_CHN_ATTR_S)); stChnAttr.enType = PT_H264; stChnAttr.u32BufSize = 1024 * 1024; HI_S32 VdecChn = 0; s32Ret = HI_MPI_VDEC_CreateChn(VdecChn, &stChnAttr); if (HI_SUCCESS != s32Ret) { // 处理错误 HI_MPI_VB_Exit(); return; } // 启动接收流 s32Ret = HI_MPI_VDEC_StartRecvStream(VdecChn); if (HI_SUCCESS != s32Ret) { // 处理错误 HI_MPI_VDEC_DestroyChn(VdecChn); HI_MPI_VB_Exit(); return; } } ``` #### 3. 主函数调用示例 ```c int main() { init_vdec(); read_stream(); return 0; } ``` ### 注意事项 - 上述代码只是一个简化的示例,实际开发中需要处理更多的错误情况、内存管理等问题。 - 海思SDK的使用需要正确配置开发环境,并且根据具体的海思芯片型号进行调整。 - ffmpeg库的使用也需要正确安装配置。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值