繁体   English   中英

C# DirectX 视频不播放

[英]C# DirectX Video Not Playing

我想制作一个 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");

什么都不显示。 任何想法是什么问题?

编辑:我正在尝试处理 Ending 事件,因此我可以在视频结束时退出应用程序,并且以某种方式设法获得了此异常:

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();
    }

这里有两个不同的问题:

支持旧版 .net

第一期:“DirectX for Managed Code”已经很老了,基于 .net 1.1 版。 为了在 .net 4 或更高版本中使用此程序集,您需要启用加载这些旧格式。 您可以通过更改项目中的文件“app.config”并在startup节点useLegacyV2RuntimeActivationPolicy设置为true来执行此操作,因此它看起来类似于:

<?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 过滤器是一种使大多数视频格式可用于 Windows 上的 DirectX 的简单且非侵入性的方式。

调试模式下的视频播放

您会发现,通常当您从 Visual Studio 启动应用程序时,视频播放会断断续续且质量低下。 在不调试的情况下启动应用程序时,质量将是完美的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM