windows下ffmpeg使用dxva2加速硬件解码

问题:

近期有解码H265格式的1080P@60压缩视频需求,使用之前的ffmpeg软解方案发现解不过来了,超极本解码一帧耗时20ms左右,所以想研究下硬解方案。

解决方案:

1、首先想到的是ffmpeg的硬解方案,一直对ffmpeg的硬解有所了解但是因为之前软解满足需求,没有多大动力去研究,这次遇到瓶颈简单查了下,资源很多,ffmpeg在examples\hw_decoder.c就提供很好的示例程序,网上的资料大多基于这个demo的。

2、其他还有英伟达的cuda方案,百度,谷歌出来有人做,做的还不错,据说能达到700帧,但是cuda依赖太多,技术难度较大,等到以后做2K,4K的265解码时再研究。

最后解决方案确定为使用ffmpeg自带硬解方案,简单,有现成的官方demo,参考资料也比较多。

实施:

代码编写比较简单,参考hw_decoder.c自己稍作修改就能改成接受实时流解码的方式,不过其中遇到一些问题,在此记录:

1、经测试我的笔记本和台式机都只支持4种方式解码:cuda、qsv、d3d11、dxva2;

     测试发现qsv不能使用,检测支持qsv解码器但是解码失败;

     cuda解码很快但是因为解码后的yuv需要从GPU拷贝到CPU(也可以不用拷贝,可以直接用GPU做渲染,不过没研究明白),这拷贝耗时达到了15~20ms,相比软解没啥提升,论坛上有人说最新的ffmpeg解决了这个问题,没有验证,暂时放弃;

     d3d这种方式解码加拷贝耗时相比软解有所提升,已经可以满足1080p60 265解码延时需求了,试图通过GPU解码不拷贝到CPU而是在GPU里直接渲染,感觉有点复杂,而且原有的显示方式是将cpu的yuv数据通过openGL渲染,改动有点费力。

    dxva2方式效率和拷贝速度相比d3d这种方式进一步提升,测试在低压版的超极本上解码加拷贝耗时在10ms以内,基本满足需求,我查看了potplayer的硬解方式,发现他硬解也是用dxva2,这种方式对硬件要求小,最终选定这个方案。

需要注意的是(硬解码出来的YUV格式并不固定,做渲染时具体处理或者通过ffmpeg将解码出来的AVFrame转换为YUV420p格式的AVFrame);

size = av_image_get_buffer_size(tmp_frame->format, tmp_frame->width,
                                        tmp_frame->height, 1);
        buffer = av_malloc(size);
        if (!buffer) {
            fprintf(stderr, "Can not alloc buffer\n");
            ret = AVERROR(ENOMEM);
            goto fail;
        }
ret = av_image_copy_to_buffer(buffer, size,
        (const uint8_t * const *)tmp_frame->data,
        (const int *)tmp_frame->linesize, tmp_frame->format,
        tmp_frame->width, tmp_frame->height, 1);

总结:

官方demo就是最好的demo,一开始没想到从ffmpeg源码中找示例,百度了不少,各家有各家修改的理由,最后发现还是官方demo最简洁,干净,把官方demo解文件修改成解实时流很轻松。

等有时间研究研究在GPU里解码直接渲染的方式,感觉对以后2K,4K高帧解码会有奇效。

还需要做下硬解软解适配,有的客户电脑比较老可能不支持硬解,还需要适配下。

代码下载地址:ffmpeg+dxva2硬解-编解码文档类资源-CSDN下载

### 回答1: 国外非常流行的步进电机STM32控制代码是指在国外广泛使用的用于控制步进电机的代码。STM32是意法半导体公司推出的一款嵌入式微控制器系列产品,广泛应用于各种电子设备中,包括步进电机的控制。 在步进电机控制方面,STM32控制代码提供了一种简单而有效的方式来实现精确的步进电机运动控制。代码通常使用基于C语言的编程,通过驱动电机的步进脉冲信号,实现电机的旋转和精确定位。 STM32控制代码通常涉及到以下几个主要方面: 1. 步进电机的驱动方式选择:根据电机类型选择合适的驱动方式,如全步进、半步进或微步进等。 2. 脉冲信号生成:通过计算产生步进电机所需的脉冲信号,控制电机的转动角度和速度。 3. 电机速度和加速度控制:通过合理的算法和参数设置,控制电机的速度和加速度,达到所需的运动效果。 4. 位置控制和定位算法:通过编码器或其他位置反馈装置获取电机实际位置信息,并与目标位置进行比较,采取控制措施来实现准确的定位和位置控制。 5. 电机保护和故障处理:通过加入保护措施来避免电机过载或其他故障,并进行诊断和处理。 通过使用STM32控制代码,可以方便地实现步进电机的精确控制和运动控制,适用于各种应用场景,如机械、自动化、工控等。该代码在国外得到广泛应用,得益于STM32丰富的功能和性能,以及全球范围内的技术支持和开发社区。 ### 回答2: 国外非常流行的步进电机STM32控制代码有很多种,其中包括基于STM32微控制器的开源软件库和示例代码。 首先,STMicroelectronics官方提供了针对STM32系列微控制器的HAL库和LL库。HAL库是高级抽象层库,提供了一组易于使用的函数和驱动程序接口,可以用于控制步进电机。LL库是低级别库,提供了更底层的控制接口和寄存器的访问,可用于高度定制化和优化。 此外,还有一些流行的第三方库和代码。例如,Arduino IDE是一个简单易用的开发平台,有很多人开发了与STM32兼容的步进电机控制库。PlatformIO也是一个流行的跨平台开发环境,有许多STM32步进电机控制库可供使用。 同时,一些开源的硬件项目,如RepRap 3D打印机,也提供了与STM32兼容的步进电机控制代码。这些项目通常使用网上开源的固件,如Marlin和Smoothieware,这些固件使用C/C++编写,具有强大的步进电机控制功能。 总的来说,STM32控制步进电机的代码非常丰富和多样化,有官方的库和示例代码,也有第三方和开源的库和项目可供选择。根据具体的应用需求和硬件平台选择合适的代码库和开发环境,可以很容易地实现步进电机的控制。 ### 回答3: 步进电机是一种常见的电机类型,其控制代码在国外非常流行。在国外,特别是在一些技术先进的国家,如美国和德国,步进电机在各种应用中广泛使用,例如打印机、机器人、自动化设备等。 控制步进电机的代码通常使用STM32微控制器,因为它是一种高性能、低功耗的微控制器,非常适合用于实时应用。以下是一个简单的步进电机控制代码示例: 1. 首先,需要定义步进电机的引脚和端口。例如,使用GPIOA端口的引脚0、1、2和3来控制步进电机的四个线圈。 2. 设置引脚为输出模式,并初始化为低电平。 3. 编写一个函数来控制步进电机的旋转方向和步长。例如,顺时针旋转可以设置引脚0和2为高电平,引脚1和3为低电平。 4. 编写一个主循环,在其中周期性地调用步进电机控制函数。可以使用延时函数来控制步进电机的速度。 使用上述代码,就可以实现对步进电机进行简单的控制。当STM32微控制器输出不同的电平信号到步进电机的引脚时,步进电机会相应地旋转。可以根据需要调整引脚的状态和延时的长度,来控制步进电机的旋转速度和方向。 需要注意的是,这只是一个简单的示例,实际的步进电机控制代码可能会更复杂,涉及到步进电机的具体规格、电机驱动器的选型和其他详细的控制参数。 在国外,有很多开源的STM32步进电机控制代码库和开发工具,可以帮助开发人员快速上手和实现复杂的步进电机控制应用。这些代码库通常具有很高的可扩展性和灵活性,可以满足不同项目的需求。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值