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

            }

        }

    }


  • 相关阅读:
    PointToPointNetDevice doesn't support TapBridgeHelper
    NS3系列—10———NS3 NodeContainer
    NS3系列—9———NS3 IP首部校验和
    NS3系列—8———NS3编译运行
    【习题 7-6 UVA
    【Good Bye 2017 C】 New Year and Curling
    【Good Bye 2017 B】 New Year and Buggy Bot
    【Good Bye 2017 A】New Year and Counting Cards
    【Educational Codeforces Round 35 D】Inversion Counting
    【Educational Codeforces Round 35 C】Two Cakes
  • 原文地址:https://www.cnblogs.com/WuCountry/p/807434.html
Copyright © 2011-2022 走看看