我正在 Visual Studio 中制作一个 C# Windows 窗体程序,每当我将 URL 设置为 Windows 媒体播放器 axWindowsMediaPLayer 对象时,该程序就会不断崩溃。
有两个窗体窗口:MainWindow 和VideoForm。 MainWindow 上有一些按钮可通过文件对话框选择文件,还有一个按钮可打开包含媒体播放器的 VideoForm 窗口。我创建了一个自定义 Video.cs 类来捕获视频文件信息。它还处理文件对话框。但是,当我将 URL 设置为媒体播放器对象时,程序崩溃并显示代码 3221225477 (0xc0000005)“访问冲突”。因此,VideoForm 窗口中媒体播放器的 URL 是通过 MainWindow 中的按钮单击事件设置的。我不确定这是否是导致访问冲突的原因。我已以管理员身份运行 Visual Studio,以确保它有权访问该文件。我检查了文件路径,它是正确的。我尝试过带或不带前面的@。
这是导致崩溃的行:
VideoWindow.MediaPlayer.URL = @auditVideo.Path;
相关代码如下:
MainWindow.cs:
Video auditVideo = new Video();
private void ButtonImportVideo_Click(object sender, EventArgs e)
{
auditVideo.InitializeFile(openFileDialogVideo);
textBoxVideoFile.Text = auditVideo.Name;
}
private void ButtonPlayVideo_Click(object sender, EventArgs e)
{
VideoForm VideoWindow = new VideoForm();
try
{
VideoWindow.MediaPlayer.URL = @auditVideo.Path; // This is what causes the crash
}
catch(Exception ex)
{
MessageBox.Show("could not load the file" + ex.Message);
}
Console.WriteLine("VideoWindow.MediaPlayer.URL is {0}", @VideoWindow.MediaPlayer.URL);
VideoWindow.Show();
}
Video.cs 类:
namespace AVCAudit
{
internal class Video
{
internal OpenFileDialog OpenFileDialog { get; private set; } //This is an AutoProperty which generates the private field behind the scenes
internal string Path { get; private set; } //set should be private for Path and Name since they refer to the actual file on disk which doesn't change
internal string Name { get; private set; }
internal void InitializeFile(OpenFileDialog fileDialogArg)
{
OpenFileDialog = fileDialogArg;
OpenFileDialog.InitialDirectory = @"C:\Users\schaney\Desktop\Neology\AVC Audit Project\avc_audit\Recordings";
OpenFileDialog.Title = "Open audit video file";
OpenFileDialog.Filter = "(mp3,wav,mp4,mov,wmv,mpg)|*.mp3;*.wav;*.mp4;*.mov;*.wmv;*.mpg|all files|*.*";
if (OpenFileDialog.ShowDialog() == DialogResult.OK)
{
Path = fileDialogArg.FileName;
Name = fileDialogArg.SafeFileName;
}
}
}
}
VideoForm.cs
namespace AVCAudit
{
public partial class VideoForm : Form
{
internal String test { get; set; }
public VideoForm() //constructor for VideoForm class. The rest of the partial class is defined in VideoForm.Designer.cs
{
InitializeComponent(); //so the constructor for this class just runs the InitializeComponent method defined in the Designer.cs file
}
private void MediaPlayer_Enter(object sender, EventArgs e)
{
}
}
}
我找到了这次崩溃的根本原因,即这些戴尔笔记本电脑与外部显卡的工作方式。有一个特定的安排,即所有图形都必须通过 CPU 的集成显卡传输,即使是那些通过外部显卡处理的图形。我有一张 nVidia Quadro 卡,但任何想要使用它的应用程序都必须首先通过集成显卡,然后 CPU 才能确定是否要使用 Quadro 来处理该请求。基本上根据我的理解,应用程序应该对 Quadro 视而不见,并通过集成显卡完成所有操作。
由于某种原因,C# axWindowsMediaPlayer 对象无法在此安排下正常工作并导致访问冲突。我猜测它正在尝试直接与 Quadro 交互。
作为解决方法,我可以通过将 nVidia 控制面板配置为对项目的调试和发布可执行文件使用集成显卡来阻止崩溃。这迫使它们仅与集成显卡交互,从而阻止访问冲突。
进入 NVIDIA 控制面板 -> 选择管理 3D 设置并选择自动选择,它对我有用