C#DirectX视频无法播放

时间:2017-01-14 21:01:05

标签: c# directx

我想制作一个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 个答案:

答案 0 :(得分:4)

这里有两个不同的问题:

支持Legacy .net

第一期:" DirectX for Managed Code"是非常老的,基于.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>

请注意,在调试过程中,您可以获得一个例外&#34;托管调试助手&#39; LoaderLock&#39;已发现问题&#34;。您可以忽略此异常。告诉Visual Studio在调试期间不应该停止此异常。

Related question/answer

编解码器支持

第二个问题是您需要安装一个允许DirectX播放mp4文件的编解码器。

默认情况下,在大多数Windows版本中都不包含这些编解码器(也不在Windows 10中)。即使您的Windows Media Player可以播放mp4文件,这也不意味着可以从DirectX使用正确的编解码器。

我发现安装LAV filters是一种简单且非侵入性的方式,可以在Windows上为DirectX提供大多数视频格式。

调试模式下的视频播放

您会发现,当您从Visual Studio启动应用程序时,视频播放将会起伏不定并且质量较低。在没有调试的情况下启动应用程序时,质量将是完美的。