Csharp: play media file using Microsoft.DirectX

简介: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; usin
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX.AudioVideoPlayback;//需到微軟官網下載SDK


namespace WindowsChineseCalender
{
    /// <summary>
    /// 塗聚文 20121222
    /// Geovin Du
    /// </summary>
    public partial class MediaPlayForm : Form
    {
        Video vdo;

        public string mode = "play";
        public string PlayingPosition, Duration;


        /// <summary>
        /// 
        /// </summary>
        public MediaPlayForm()
        {
            InitializeComponent();
            VolumeTrackBar.Value = 4;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MediaPlayForm_Load(object sender, EventArgs e)
        {
            MaximizeBox = false;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnupload_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.ShowDialog();
            openFileDialog1.Title = "Select video file..";
            openFileDialog1.InitialDirectory = Application.StartupPath;
            openFileDialog1.DefaultExt = ".avi";
            openFileDialog.Filter = "Media Files|*.mpg;*.avi;*.wma;*.mov;*.wav;*.mp2;*.mp3|All Files|*.*";
            vdo = new Video(openFileDialog.FileName);

            vdo.Owner = panel1;
            panel1.Width = 700;
            panel1.Height = 390;
            Duration = CalculateTime(vdo.Duration);
            PlayingPosition = "0:00:00";
            txtStatus.Text = PlayingPosition + "/" + Duration;

            vdoTrackBar.Minimum = 0;
            vdoTrackBar.Maximum = Convert.ToInt32(vdo.Duration);
        }
        /// <summary>
        /// 播放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPlay_Click(object sender, EventArgs e)
        {
            if (vdo != null)
            {
                if (vdo.Playing)
                {
                    vdo.Pause();
                    timer1.Stop();
                    btnPlay.BackgroundImage = WindowsChineseCalender.Properties.Resources.btnplay;
                }
                else
                {
                    vdo.Play();
                    timer1.Start();

                    btnPlay.BackgroundImage = WindowsChineseCalender.Properties.Resources.pause;
                }
            }
        }
        /// <summary>
        /// 停止
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStop_Click(object sender, EventArgs e)
        {
            vdo.Stop();
            btnPlay.BackgroundImage = WindowsChineseCalender.Properties.Resources.btnplay;
            vdoTrackBar.Value = 0;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            PlayingPosition = CalculateTime(vdo.CurrentPosition);
            txtStatus.Text = PlayingPosition + "/" + Duration;

            if (vdo.CurrentPosition == vdo.Duration)
            {
                timer1.Stop();
                Duration = CalculateTime(vdo.Duration);
                PlayingPosition = "0:00:00";
                txtStatus.Text = PlayingPosition + "/" + Duration;
                vdo.Stop();
                btnPlay.BackgroundImage = WindowsChineseCalender.Properties.Resources.btnplay;
                vdoTrackBar.Value = 0;
            }
            else
            {
                if (vdoTrackBar.Value >=2500)
                {
                    vdoTrackBar.Value--;
                }
                else
                {
                    vdoTrackBar.Value += 1;
                }
                
     
            }
        }
        /// <summary>
        /// 化為時,分,秒樣式
        /// </summary>
        /// <param name="Time"></param>
        /// <returns></returns>
        public string CalculateTime(double Time)
        {
            string mm, ss, CalculatedTime;
            int h, m, s, T;

            Time = Math.Round(Time);
            T = Convert.ToInt32(Time);

            h = (T / 3600);
            T = T % 3600;
            m = (T / 60);
            s = T % 60;

            if (m < 10)
                mm = string.Format("0{0}", m);
            else
                mm = m.ToString();
            if (s < 10)
                ss = string.Format("0{0}", s);
            else
                ss = s.ToString();

            CalculatedTime = string.Format("{0}:{1}:{2}", h, mm, ss);

            return CalculatedTime;
        }
        /// <summary>
        /// 播放時段
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void vdoTrackBar_Scroll(object sender, EventArgs e)
        {
            if (vdo != null)
            {
                vdo.CurrentPosition = vdoTrackBar.Value;
            }

        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public int CalculateVolume()
        {
            switch (VolumeTrackBar.Value)
            {
                case 1:
                    return -1500;
                case 2:
                    return -1000;
                case 3:
                    return -700;
                case 4:
                    return -600;
                case 5:
                    return -500;
                case 6:
                    return -400;
                case 7:
                    return -300;
                case 8:
                    return -200;
                case 9:
                    return -100;
                case 10:
                    return 0;
                default:
                    return -10000;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            Duration = CalculateTime(vdo.Duration);
            PlayingPosition = "0:00:00";
            txtStatus.Text = PlayingPosition + "/" + Duration;
        }
        /// <summary>
        /// 音量調節
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void VolumeTrackBar_Scroll(object sender, EventArgs e)
        {
            //if (vdo != null)
            //{
            //    vdo.Audio.Volume = CalculateVolume();
            //}

            if (vdo != null)
            {
                vdo.Audio.Volume = CalculateVolume();
            }
        }
        /// <summary>
        /// 全屏
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonFull_Click(object sender, EventArgs e)
        {
            vdo.Fullscreen = true;           

              
        }
    }
}

目录
相关文章
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
这篇文章介绍了一种简单易懂的全景图高清下载方法,使用在线网站全景管家,支持下载包括建E、720yun、酷雷曼等多个平台的全景图原图,并简要解析了全景图的原理和制作方法。
简单易懂的 全景图高清下载方法以及原理简要解析(支持下载建E、720yun、酷雷曼、景站、酷家乐、百度街景原图)
|
传感器 编解码 资源调度
聊一聊计算机视觉中的高斯分布
高斯分布,又称正态分布,是概率统计中常见的分布形式。在计算机视觉领域,高斯分布被广泛应用于图像噪声建模、高斯滤波、特征表示、背景建模及高斯核密度估计等方面,是许多图像处理算法的核心。通过高斯分布,可以有效处理噪声、平滑图像、提取特征及建模背景,提升算法性能。
2704 0
|
人工智能 文字识别 小程序
通义听悟--一个懂你的AI助理
介绍什么是通义听悟以及通义听悟的功能体验
16257 68
|
存储 计算机视觉
西门子S7-1200计数器编程实例
计数器用来累计脉冲的个数。在西门子S7-1200 PLC中有三种类型的计数器:加减计数器CTUD、加计数器CTU、减计数器CTD。每个计数器都使用存储块中存储的结构来保存计数器数据。在编辑器中放置计数器指令时,分配相应的数据块即背景数据块。计数值的数值范围取决于所选的数据类型。
西门子S7-1200计数器编程实例
|
存储 Android开发
方法:一键把一堆手机号码一次性快速导入手机通讯录
手机是人们日常沟通常用的工具,所以自然就要用到手机里面的通讯录联系。因此我们常要把别人的号码存入到手机通讯录里面,如果只是存五个十个那就动动手指就可以了。但是如果你想存把一个电脑excel表格里面的几百个、几千个、几万个等数量级别的联系人一键导入手机通讯录,显然手动一个个来存入是不现实的。我这里演示,通过借助网上常见的便捷工具软件,金芝号码提取导入助手,代替你手动工作来快速完成这个工作,如何一键把一堆手机号码一次性快速导入手机通讯录,省事省时省力。下面做个操作过程的图文讲解。
4854 0
方法:一键把一堆手机号码一次性快速导入手机通讯录
|
Web App开发 前端开发 开发者
Uncaught (in promise)解决方法
Uncaught (in promise) 错误表示在 Promise 中发生了异常,但是没有被捕获。解决这个问题的方法主要有以下几种: 使用 try catch 处理 Promise 中的异常。通过在 Promise 中使用 try catch 捕获异常,防止异常被抛出并且可以在捕获后进行处理。
3700 0
|
网络协议 网络虚拟化 网络架构
计算机网络知识总结:ip地址、分类及什么样的ip主机地址可以分配给主机使用
计算机网络知识总结:ip地址、分类及什么样的ip主机地址可以分配给主机使用
2521 0
计算机网络知识总结:ip地址、分类及什么样的ip主机地址可以分配给主机使用
|
传感器 数据采集 边缘计算
谈谈DCS和SCADA在数字化转型中的的作用
几十年来,工业控制系统在工业自动化中扮演着重要的角色,企业通过它收集、处理和操作来自生产车间的数据。
谈谈DCS和SCADA在数字化转型中的的作用
|
大数据 云计算
阿里云大数据分析师认证是什么,apc证书含金量如何
阿里云大数据分析师认证也就是acp认证,这个认证是目前很火的一个认证,您如果想要考证,可以了解一下这个证书,目前大数据行业非常火,您如果想要转行,或者想要提升自己的能力,可以试一试这个证书,拿到这个证书之后,您一定能收到更好的公司邀约,快去试试吧。想要考证可以联系小编或者联系认证大使,我们可以帮助您快速考取证书,让您的职业生涯更上一层楼。
2722 0
阿里云大数据分析师认证是什么,apc证书含金量如何

热门文章

最新文章