zoukankan      html  css  js  c++  java
  • 小记一下DirectX里的Video和Audio

    原本是DX里的一个例子,我觉得还可以,就COPY出来,想改改看。结果让我大失所望。
    最简单要求,就是对音频文件和视频文件可以定位查找,本来它的Video和Audio类都提供了Seek方法,但它们根本不能工作,每次Seek后,都回到0的位置上。后来用Reflector来看它的源代码,结果也是不尽人意,很多底层的代码没有办法反射出来。特别是DX里的一些接口,根本无法查看。最后也只好先暂停了。
    本来还想着,要是DX在.Net下封装的比较好的话,我就可以少用C++的COM组件了,直接用C#来写组件也方便多了。没想到MS的托管DX确实还不够完善,我看可能要等以后的版本了。不过它的MediaPlay的SDK还是不错的,有机会也看看。

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using Microsoft.DirectX;
    using Microsoft.DirectX.AudioVideoPlayback;

    namespace Webb.DirectX.Debug2
    {
        
    /// <summary>
        
    /// Summary description for Form1.
        
    /// </summary>

        public class AVPlayer : System.Windows.Forms.Form
        
    {

            
    private string filterText = "Video Files (*.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v; *.wmv)|*.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v; *.wmv|" +
                
    "Audio files (*.wav; *.mpa; *.mp2; *.mp3; *.au; *.aif; *.aiff; *.snd; *.wma)|*.wav; *.mpa; *.mp2; *.mp3; *.au; *.aif; *.aiff; *.snd; *.wma|" +
                
    "MIDI Files (*.mid, *.midi, *.rmi)|*.mid; *.midi; *.rmi|" +
                
    "Image Files (*.jpg, *.bmp, *.gif, *.tga)|*.jpg; *.bmp; *.gif; *.tga|" +
                
    "All Files (*.*)|*.*";

            
    private Video ourVideo = null;
            
    private Audio ourAudio = null;

            
    Winforms variables

            
    public AVPlayer()
            
    {
                
    //
                
    // Required for Windows Form Designer support
                
    //
                InitializeComponent();

                OpenFile();
            }


            
    private bool _IsVideo = false;

            
    /// <summary>
            
    /// Clean up any resources being used.
            
    /// </summary>

            protected override void Dispose( bool disposing )
            
    {
                CleanupObjects();
                
    if( disposing )
                
    {
                    
    if (components != null
                    
    {
                        components.Dispose();
                    }

                }

                
    base.Dispose( disposing );
            }


            
    Windows Form Designer generated code

            
    private void CleanupObjects()
            
    {
                
    if (ourVideo != null)
                    ourVideo.Dispose();
                
    if (ourAudio != null)
                    ourAudio.Dispose();
            }


            
    private void OpenFile()
            
    {
    //            if ((ofdOpen.InitialDirectory == null) || (ofdOpen.InitialDirectory == string.Empty))
    //                ofdOpen.InitialDirectory = DXUtil.SdkMediaPath;

                ofdOpen.Filter 
    = filterText;
                ofdOpen.Title 
    = "Open media file";
                ofdOpen.ShowDialog(
    this);

                
    // Now let's try to open this file
                if ((ofdOpen.FileName != null&& (ofdOpen.FileName != string.Empty))
                
    {
                    
    try
                    
    {
                        
    if (ourVideo == null)
                        
    {
                            
    // First try to open this as a video file
                            ourVideo = new Video(ofdOpen.FileName);
                            ourVideo.Ending 
    += new System.EventHandler(this.ClipEnded);
                            ourVideo.Owner 
    = this;
                            
    // Start playing now
                            ourVideo.Play();
                            
    this._IsVideo = true;
                        }

                        
    else
                        
    {
                            ourVideo.Open(ofdOpen.FileName, 
    true);
                        }

                    }

                    
    catch
                    
    {
                        
    try
                        
    {
                            
    // opening this as a video file failed.. Maybe it's audio only?
                            ourAudio = new Audio(ofdOpen.FileName);
                            ourAudio.Ending 
    += new System.EventHandler(this.ClipEnded);
                            
    // Start playing now
                            ourAudio.Play();
                            
    this._IsVideo = false;
                        }

                        
    catch
                        
    {
                            MessageBox.Show(
    "This file could not be opened.""Invalid file.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }

                    }

                }

            }


            
    private void ClipEnded(object sender, System.EventArgs e)
            
    {
                
    // The clip has ended, stop and restart it
    //            if (ourVideo != null)
    //            {
    //                ourVideo.Stop();
    //                ourVideo.Play();
    //            }
    //            else
    //            {
    //                if (ourAudio != null)
    //                {
    //                    ourAudio.Stop();
    //                    ourAudio.Play();
    //                }
    //            }
            }


            
    private void mnuOpen_Click(object sender, System.EventArgs e)
            
    {
                
    this.OpenFile();
            }


            
    private void mnuPlay_Click(object sender, System.EventArgs e)
            
    {
                
    if (ourVideo != null)
                    ourVideo.Play();
                
    else
                
    {
                    
    if (ourAudio != null)
                        ourAudio.Play();
                }

            }


            
    private void mnuStop_Click(object sender, System.EventArgs e)
            
    {
                
    if (ourVideo != null)
                    ourVideo.Stop();
                
    else
                
    {
                    
    if (ourAudio != null)
                        ourAudio.Stop();
                }

            }


            
    private void mnuPause_Click(object sender, System.EventArgs e)
            
    {
                
    if (ourVideo != null)
                    ourVideo.Pause();
                
    else
                
    {
                    
    if (ourAudio != null)
                        ourAudio.Pause();
                }

            }


            
    private void mnuExit_Click(object sender, System.EventArgs e)
            
    {
                
    this.Dispose();
            }


            
    private void mnuFull_Click(object sender, System.EventArgs e)
            
    {
                
    if (ourVideo != null)
                    ourVideo.Fullscreen 
    = !ourVideo.Fullscreen;
            }

            
    protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
            
    {
                
    if ( (e.Alt) && (e.KeyCode == System.Windows.Forms.Keys.Return))
                
    {
                    mnuFull_Click(mnuFull, 
    null);
                }


                
    // Allow the control to handle the keystroke now
                base.OnKeyDown(e);
            }


            
    private void toolBar1_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
            
    {
                
                
    switch(e.Button.Text)
                
    {
                    
    case "Play":
                        
    if(this._IsVideo)
                        
    {
                            
    this.ourVideo.Play();
                        }

                        
    else
                        
    {
                            
    this.ourAudio.Play();
                        }

                        
    break;
                    
    case "End":
                        
    if(_IsVideo)
                        
    {
                            
    double m_length = this.ourVideo.Duration;                    
                            
    try
                            
    {
                                
    if(this.ourVideo.SeekingCaps.CanSeekForwards)
                                
    {
                                    
    double m_result = this.ourVideo.SeekCurrentPosition(5,SeekPositionFlags.AbsolutePositioning);
                                    MessageBox.Show(m_result.ToString());
                                }

                            }

                            
    catch(Exception ex)
                            
    {
                                MessageBox.Show(ex.Message);
                            }

                            
    this.ourVideo.Pause();
                        }

                        
    else
                        
    {
                            
    double m_length = this.ourAudio.Duration;
                            
    double m_result = this.ourAudio.SeekCurrentPosition(5,SeekPositionFlags.AbsolutePositioning);
                            
    this.ourAudio.Pause();
                        }

                        
    break;
                    
    case "Begin":
                        
    if(_IsVideo)
                        
    {
                            
    this.ourVideo.SeekCurrentPosition(0,SeekPositionFlags.AbsolutePositioning);
                            
    this.ourVideo.Pause();
                        }

                        
    else
                        
    {
                            
    this.ourAudio.SeekCurrentPosition(0,SeekPositionFlags.AbsolutePositioning);
                            
    this.ourAudio.Pause();
                        }

                        
    break;
                    
    case "Stop":
                        
    if(_IsVideo)
                        
    {
                            
    this.ourVideo.Pause();
                        }

                        
    else
                        
    {
                            
    this.ourAudio.Pause();
                        }

                        
    break;
                    
    case "Next":
                        
    if(_IsVideo)
                        
    {
                            
    this.ourVideo.SeekCurrentPosition(5,SeekPositionFlags.IncrementalPositioning);
                            
    //this.ourVideo.Pause();
                        }

                        
    else
                        
    {
                            
    this.ourAudio.SeekCurrentPosition(5,SeekPositionFlags.IncrementalPositioning);
                            
    //this.ourAudio.Pause();
                        }

                        
    break;
                }

            }

        }

    }


  • 相关阅读:
    input中的disabled 和 readonly的区别
    pwa-serviceWorker与页面通信postMessage
    PWA之push服务
    vue+typescript入门学习
    基于node 搭建http2服务
    阻止默认行为是配合passive使用
    正则表达式exec方法的陷阱
    serviceWorker-资料参考
    MVC的增删改和Razor
    MVC基础
  • 原文地址:https://www.cnblogs.com/WuCountry/p/807434.html
Copyright © 2011-2022 走看看