我是 DirectX 新手,目前正在开发一个项目,需要使用 SharpDX.MediaFoundation.DirectX 库中的 VideoDecoderService 类检索 DXVA(DirectX 视频加速)解码器 GUID。我的主要目标是列出解码器并将信息记录到日志文件中以供进一步分析。
问题: 在尝试检索 DXVA 解码器 GUID 时,我遇到了报告计数变量的问题。为 42,但 guid 数组实际上是空 guid,除了第一个索引处的 guid 始终只填充 guid 的第一部分,guid 的其他部分是空的(零)。
我得到的观察到的 GUID 示例:
当我再次运行时,我得到了完全不同的结果:
因此数组中第一个 guid 的第一部分是不同的,数组中的其他 guid 始终为空。
有人可以帮助我理解为什么 guid 数组是空的,除了第一个索引处的 GUID 之外,而计数输出的目标是解码器的 guid 比一个多得多?
完整代码示例:
using System;
using System.Windows;
using SharpDX.Direct3D9;
using SharpDX.MediaFoundation;
using SharpDX.MediaFoundation.DirectX;
namespace ListDecoders
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Initialize Media Foundation
MediaManager.Startup();
try
{
// Create a Direct3D device
using (var d3dDevice = new Device(new Direct3D(), 0, SharpDX.Direct3D9.DeviceType.Hardware, IntPtr.Zero, CreateFlags.SoftwareVertexProcessing | CreateFlags.Multithreaded | CreateFlags.FpuPreserve, new PresentParameters
{
Windowed = true,
BackBufferWidth = 640,
BackBufferHeight = 480,
BackBufferFormat = Format.Unknown, // or specify a format
SwapEffect = SwapEffect.Discard,
PresentFlags = PresentFlags.Video
}))
{
// Create the VideoDecoderService with the Direct3D device
using (var videoDecoderService = new VideoDecoderService(d3dDevice))
{
// Get the DXVA decoder GUIDs
var guids = GetDecoderDeviceGuids(videoDecoderService);
// Output the GUIDs
foreach (var guid in guids)
{
Console.WriteLine(guid);
}
}
}
}
finally
{
// Shutdown Media Foundation
MediaManager.Shutdown();
}
}
static Guid[] GetDecoderDeviceGuids(VideoDecoderService videoDecoderService)
{
var guids = new Guid[100]; // Adjust the array size as needed
videoDecoderService.GetDecoderDeviceGuids(out int count, guids);
// Trim the array to the actual count
Array.Resize(ref guids, count);
return guids;
}
}
}
感谢您的帮助。
SharpDX 似乎有一个错误。你能做的就是使用底层的原生 直接IDirectXVideoDecoderService接口,像这样:
static Guid[] GetDecoderDeviceGuids(VideoDecoderService videoDecoderService)
{
var svc = (IDirectXVideoDecoderService)Marshal.GetObjectForIUnknown(videoDecoderService.NativePointer);
svc.GetDecoderDeviceGuids(out var count, out var guids);
return guids;
}
[ComImport, Guid("fc51a551-d5e7-11d9-af55-00054e43ff02"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface IDirectXVideoDecoderService
{
void CreateSurface(); // unused, not fully defined
void GetDecoderDeviceGuids(out int count, [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] out Guid[] pGuids);
// we don't need the rest
}
PS:如果您是 DirectX 新手,您应该使用 DirectX11 或 DirectX12 而不是 DirectX9,SharpDX 现已弃用。