avcodec_send_packet闪退问题
运行环境
- 操作系统:windows
- 进程:32位
- 功能: 4路高清解码渲染
问题描述
64位
- 4路高清解码、渲染正常
32位
-
运行几分钟后出现错误
-
avcodec_send_packet 返回EPERM(-1):Operation not permitted
-
出现返回EPERM错误后,很快程序闪退
问题定位
- 闪退时查看avcodec_send_packet堆栈:
- 解码器结构体正常
- AVPacket正常:I/P帧都会出现这种错误
- avcodec_is_open确定解码器已打开
- 调整ffmpeg日志等级: av_log_set_level(AV_LOG_DEBUG) 日志输出如下
Failed to begin frame: 0x8007000e
hardware accelerator failed to decode picture
- 查看ffmpeg源码0x8007000e错误描述如下
Ran out of memory
#define E_OUTOFMEMORY _HRESULT_TYPEDEF_(0x8007000EL)IDirectXVideoDecoder_BeginFrame返回E_OUTOFMEMORY
- 结合AI搜索结果得出结论
- IDirectXVideoDecoder_BeginFrame 返回 E_OUTOFMEMORY 在于32位进程的虚拟地址空间不足,无法满足DXVA硬件解码的资源映射需求。
- 32位应用单进程最大寻址空间:2GB(默认)~3GB(/LARGEADDRESSAWARE + 32位OS)~4GB(/LARGEADDRESSAWARE + 64位OS)
- 4路1080p硬解码场景下,每路解码会分配YUV缓冲区、DXVA2表面、帧队列、临时buffer等,理论上内存总量容易逼近上限,尤其是多线程、多缓冲队列时。
- 内存碎片化(尤其是频繁分配/释放显存或大块内存)也会导致即使还有剩余空间,分配失败。
问题结论
- 32位进程的虚拟地址空间不足,暂放弃32进程支持硬解码渲染(目前使用32进程的场景也很少了)