C# DirectX视频无法播放

3

我想制作一个C# Windows窗体应用程序,当你点击它时,会显示一个笔,然后变成菠萝,再点击它会变成苹果,最后又变回笔。当你点击笔时,会播放一段音乐视频。 但是我不喜欢使用Windows Media Player来显示视频,这对我来说不起作用。以下是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.DirectX.DirectSound;
using Microsoft.DirectX.AudioVideoPlayback;
using Microsoft.DirectX;

namespace Picture_Button
{
    public partial class Form1 : Form
    {
        Video video = new Video("C:\\Users\\Pushkin\\Desktop\\PPAP.mp4");
        private int clicks = 0;
        public Form1()
        {
            InitializeComponent();
            video.Owner = this;
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            clicks++;
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            switch (clicks)
            {
                case 0: pictureBox1.Image = Properties.Resources.Pineapple; break;
                case 1: pictureBox1.Image = Properties.Resources.Apple; break;
                case 2: pictureBox1.Image = Properties.Resources.Pen; break;
                case 3: video.Play(); break;
                case 4: video.Dispose(); break;
            }
        }
    }
}

实际上什么事情也没有发生,程序就像陷入无限循环一样冻结在这里:

Video video = new Video("C:\\Users\\Pushkin\\Desktop\\PPAP.mp4");

没有任何内容显示。你有什么想法是问题出在哪里了吗?

编辑:我正在尝试处理“结束”事件,以便在视频结束时使应用程序退出,但不知何故,我遇到了这个异常:

System.NullReferenceException occurred
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=Microsoft.DirectX.AudioVideoPlayback
StackTrace:
at VideoWndProc(HWND__* hWnd, UInt32 uMsg, UInt32 wParam, Int32 lParam)
InnerException: 

通过添加以下代码:
video.Ending += new System.EventHandler(this.Video_Ending);
//some code
private void Video_Ending(object sender, EventArgs e)
    {
        //throw new NotImplementedException();
        video.Dispose();
        Application.Exit();
    }
1个回答

6
这里有两个不同的问题:

支持旧版 .net

第一个问题:“Managed Code 的 DirectX”非常古老,基于 .net 1.1 版本。要在 .net 4 或更高版本中使用此程序集,您需要启用加载这些旧格式的功能。您可以通过更改项目中的“app.config”文件,并将 useLegacyV2RuntimeActivationPolicy 设置为 truestartup 节点上来实现这一点,使其类似于以下内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true" > 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
    </startup>
</configuration>

请注意,在调试过程中,您可能会遇到异常“Managed Debugging Assistant 'LoaderLock' has detected a problem”。您可以忽略此异常。告诉Visual Studio在调试期间不要停止在此异常处。 相关问题/答案

编解码器支持

您需要安装一个允许DirectX播放mp4文件的编解码器。这些编解码器通常不包含在大多数Windows版本(包括Windows 10)中。即使您的Windows Media Player可以播放mp4文件,这也不意味着正确的编解码器可用于从DirectX使用。
我发现安装LAV filters是使大多数视频格式可用于Windows上的DirectX的一种简单而非侵入性的方法。

调试模式下的视频播放

您会发现,当您从Visual Studio启动应用程序时,视频播放会卡顿且质量较低。在不进行调试的情况下启动应用程序时,质量将完美无缺。

谢谢,它起作用了,而且确实可以播放.mp4文件。不过我想知道是否可以将视频作为资源播放。 - Cosmin Petolea
将资源写入临时文件。https://dev59.com/kHRA5IYBdhLWcg3wsgBP#7460114 - NineBerry
感谢所有的帮助,我已经更新了帖子,并附上了我在项目中遇到的新问题。 - Cosmin Petolea
1
这不是在这里的工作方式。请提出一个单独的问题。 - NineBerry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接