勾选Prefer 32-bit为何导致检索的视频压缩编解码器不同?
为何勾选/取消Prefer 32-bit时枚举视频编解码器结果不同?
这个差异的核心原因是Windows系统对32位/64位COM组件(包括视频编解码器)的隔离机制,不同位数的进程只能访问对应位数的已注册编解码器。
1. Prefer 32-bit选项的实际影响
当项目目标平台设为Any CPU时:
- 勾选
Prefer 32-bit:在64位Windows系统上,进程会以32位模式运行;在32位系统上则正常以32位运行。 - 取消勾选:在64位系统上以64位进程运行,32位系统上以32位进程运行。
2. 编解码器的位数隔离规则
Windows系统中,32位和64位的编解码器是分开注册和管理的:
- 32位编解码器的注册表信息存放在
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes分支 - 64位编解码器的注册表信息存放在
HKEY_LOCAL_MACHINE\SOFTWARE\Classes分支
你代码中使用的ICreateDevEnum是DirectShow的COM接口,它会根据当前进程的位数,仅枚举对应位数的已注册滤镜(编解码器属于DirectShow滤镜的一种)。
3. 对应你给出的结果分析
- 勾选Prefer 32-bit(32位进程):枚举到的
@device:cm:开头的条目是32位VCM(视频压缩管理器)编解码器(如cvid、xvid等),这些编解码器只有32位版本,或者64位进程无法访问它们的注册信息。 - 取消勾选(64位进程):枚举到了
ffdshow video encoder的64位版本,同时无法访问32位专属的VCM编解码器,因此丢失了@device:cm:开头的条目。
你的枚举代码如下:
public static List<string> GetInstalledVideoCompressorCodecs() { var codecs = new List<string>(); var filterCategory = FilterCategory.VideoCompressorCategory; IMoniker[] monikers = new IMoniker[1]; // Get a system device enumerator var devEnum = (ICreateDevEnum)new CreateDevEnum(); // Enumerate the video codecs installed on the system devEnum.CreateClassEnumerator(filterCategory, out IEnumMoniker monikerEnum, 0); while (monikerEnum.Next(1, monikers, IntPtr.Zero) == 0) { monikers[0].GetDisplayName(null, null, out string codecName); // Add the codec name to the list codecs.Add(codecName); } return codecs; }
勾选Prefer 32-bit时的结果:
@device:dmo:{7E320092-596A-41B2-BBEB-175D10504EB6}{33D9A760-90C8-11D0-BD43-00A0C911CE86} @device:dmo:{D23B90D0-144F-46BD-841D-59E4EB19DC59}{33D9A760-90C8-11D0-BD43-00A0C911CE86} @device:dmo:{F7FFE0A0-A4F5-44B5-949E-15ED2BC66F9D}{33D9A760-90C8-11D0-BD43-00A0C911CE86} @device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\DV Video Encoder @device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\MJPEG Compressor @device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\cvid @device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\i420 @device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\iyuv @device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\mrle @device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\msvc @device:cm:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\xvid
取消勾选Prefer 32-bit时的结果:
@device:dmo:{7E320092-596A-41B2-BBEB-175D10504EB6}{33D9A760-90C8-11D0-BD43-00A0C911CE86} @device:dmo:{D23B90D0-144F-46BD-841D-59E4EB19DC59}{33D9A760-90C8-11D0-BD43-00A0C911CE86} @device:dmo:{F7FFE0A0-A4F5-44B5-949E-15ED2BC66F9D}{33D9A760-90C8-11D0-BD43-00A0C911CE86} @device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\DV Video Encoder @device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\ffdshow video encoder @device:sw:{33D9A760-90C8-11D0-BD43-00A0C911CE86}\MJPEG Compressor
内容的提问来源于stack exchange,提问作者Mickael Bergeron Néron
相关产品推荐
相关产品推荐

