DirectX托管音频视频播放类的使用总结

欢迎光临Sdhjt的窝,本篇心得属于原创,转载请注明出处,谢谢!

 

作者:Sdhjt

DirectXSDK里有支持.NET的托管类库,大大方便了我们这些.NET程序员。其中Microsoft.DirectX.AudioVideoPlayback类负责播放音频和视频文件。Audio类负责播放音频文件,Video类负责播放视频文件。这两个类都支持公共解码器,也就是说只要安装了解码包都可以用这两个类播放出来(甚至可以播放图片),非常强大。下面以Video类来说明:

一、引用Microsoft.DirectX.AudioVideoPlayback

Imports Microsoft.DirectX.AudioVideoPlayback

二、声明Video类。

Public MainMovie As Video

三、对Video进行实例化。

            '尝试打开文件

            Try

                MainMovie = New Microsoft.DirectX.AudioVideoPlayback.Video(影片路径)

            Catch ex As Exception

                Exit Sub

            End Try

这里之所以用Try主要是因为影片路径对应的文件可能不存在、不是视频文件或者文件已损坏。用DirectX播放视频有一个缺点,就是解码器如果不完善的话,播放一些畸形视频有可能崩溃,所以尽量播放类似WMV这样的通用格式的视频。

四、指定播放容器。

                ' Video文件分配给创建的PictureBox组件

                MainMovie.Owner = MainShowForm.FrontMoviePictureBox

设置后视频就会在指定的容器内播放,一般是用PictureBox。这里有个问题,就是用DirectX播放的视频会覆盖掉其上层的所有控件,解决方法就是把PictureBox控件放入一个Panel面板控件里,这样其上控件就不会被覆盖。

五、添加事件句柄。

            '添加事件句柄

            AddHandler MainMovie.Ending, 播放结束处理过程

事件不多,但是都是最有用的,像开始播放,播放结束,停止播放等等。注意声明处理过程的时候函数签名一定要一致。

六、重新调整控件大小。

这是在别人的代码里出现的,我没有测试,但是估计作用是为了防止Video自动调整播放容器的大小。在函数最前面可以加上:

        Dim Height As Integer = 视频播放容器.Height

        Dim Width As Integer = 视频播放容器.Width

后面指定播放控件后,加上:

            ' 以记录的PictureBox控件的大小来重新定义

            视频播放容器.Width = Width

            视频播放容器.Height = Height

以上六个部分是打开视频文件的时候用到的,下面还有对播放状态的控制。其实很简单,如下:

一、播放状态控制。

    Public Sub CtlMovie(ByVal 控制 As 播放控制)

        Try

            Select Case 控制

                Case 播放控制.播放

                    MainMovie.Play()

                Case 播放控制.停止

                    MainMovie.Stop()

                Case 播放控制.暂停

                    MainMovie.Pause()

            End Select

 

        Catch ex As Exception

 

        End Try

    End Sub

又用了Try,防止因Video没有被实例化而崩溃。调用的这几个功能都是Video类自带的。

二、播放位置控制。

这个实现起来比较灵活,例如下面代码:

                MiddleMovie.SeekCurrentPosition(MiddleCycleState.StartMovie * 10000000, SeekPositionFlags.AbsolutePositioning)

                MiddleMovie.Play()

实现了从指定位置开始播放的功能。SeekCurrentPosition有两个参数,第一个是位置,第二个是寻址方式。位置是浮点型的,注意这里以10000000之一秒为单位,所以以秒为单位需要乘以10000000(不知微软怎么想的,用这种变态的单位,下面的音量也是这样)。

三、播放音量控制。

Video里面还有一个子类Audio,专门用来控制音频的(其实就是我们上面提到的Audio类)。音量控制就用它了。代码如下:

    '改变音量大小

    Public Sub ChangeVol(ByVal Vol As Integer)

        Try

            If Not (MusicPlayer Is Nothing) Then

                MusicPlayer.Volume = Vol

            End If

        Catch ex As Exception

        End Try

    End Sub

Try,目的与上文的相同。而音量的取值比较变态,大约是-10000~0。负值不知最低多少,但是0是最高的。

说完播放控制,就提提怎么销毁Video类吧。播放完成后可以添加事件代码实现循环播放。真正不需要播放的时候需要销毁Video,理由不用多说了,是个好习惯。代码如下:

    Public Sub CloseMovie()

        Try

            MainMovie.Dispose()

            MainMovie = Nothing

        Catch ex As Exception

 

        End Try

    End Sub

还有其他功能没有说,像获取播放位置,全屏播放,设置停止播放的位置等等,在VS的对象浏览器里写的非常明白,总之这个类还是比较简单易用的,在此仅起个抛砖引玉的作用。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值