65.9K
CodeProject 正在变化。 阅读更多。
Home

DirectShow VB.NET 示例

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (17投票s)

2008 年 12 月 24 日

公共领域

1分钟阅读

viewsIcon

146439

downloadIcon

16426

一个 VB.NET 示例,展示如何在 VB.NET 中使用 DirectShow。

引言

这个应用程序几乎可以播放所有媒体类型。DirectShow 可以播放更多文件类型,但我还没有编写相应的代码。你可以在你的应用程序中使用它。DirectX 非常可靠。我编写这个是因为没有 VB.NET 源代码说明如何使用 DirectShow 播放视频(.avi、.mpg、.wmv)和音频(.mp3、.wav)。我将其从 DirectShow SDK 附带的一个 C# 示例转换而来。它仍然需要大量的工作。据我所知,这是第一个。我可能错了。

DirShowPic.JPG

背景

我从 DirectShow SDK 转换了一个 C# 示例并开始着手。这是一个示例,仍然需要改进。我包含了 DirectShow 库 DLL。它非常易于使用。

Using the Code

确保 DirectShow 库 DLL 在你的应用程序中被引用,并加载一个新的图。要使用这个应用程序,请选择你希望视频显示的句柄。并调用 Sub OpenFile(FilePath, Handle of Window, Control Name)

    Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object,
        ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
        If e.Cancel = True Then Exit Sub
        'Call The Sub to Open the File. OpenFile(FilePath, Handle of Window, Control Name)
        OpenFile(OpenFileDialog1.FileName, VidScreenBox.Handle, Me)
    End Sub

Sub OpenFile 设置属性。它将所有者设置为将播放视频的窗体句柄(如果它是视频文件)。

Private Sub OpenFile(ByVal fName As String, ByVal VidHand As IntPtr,
    ByVal VidCtrl As System.Windows.Forms.Control)
        ' Make sure everything is closed
        filename = ""
        CloseClip()

        MaxToolStripMenuItem.Enabled = True
        MinToolStripMenuItem.Enabled = True
        CustomToolStripMenuItem.Enabled = True
        NormalPlaybackRateToolStripMenuItem.Enabled = True
        DecreasePlaybackRateToolStripMenuItem.Enabled = False
        IncreasePlaybackRateToolStripMenuItem.Enabled = True
        HalfSpeedToolStripMenuItem.Enabled = True
        DoubleSpeedToolStripMenuItem.Enabled = True
        DoubleSize200ToolStripMenuItem.Enabled = True
        NormalSize100ToolStripMenuItem.Enabled = True
        HalfSize50ToolStripMenuItem.Enabled = True
        Size75ToolStripMenuItem.Enabled = True
        FullScreenToolStripMenuItem.Enabled = True

        UseHand = VidHand 'Handle to Display Video if any
        UseCtrl = VidCtrl 'Control to Display Video if any

        filename = fName
        currentState = PlayState.Stopped 'Reset State to Stopped
        currentVolume = VolumeFull 'Reset Volume

        PlayMedia(fName) 'Call Main Sub
        Call SetFormTitle()
        Timer1.Enabled = True
    End Sub

下一个 Sub 加载图构建器,并加载 DirectShow 用于播放音频和将视频渲染到窗体句柄的接口。在调用这些子程序之后,你可以使用 DirectShow 接口 mediaControlmediaEventExbasicAudiobasicVideovideoWindowMediaPosition...来控制音频和视频。很简单。

Private Sub PlayMedia(ByVal fName As String)
        Dim hr As Integer = 0
        If fName = Nothing Then Exit Sub
        Try
            graphBuilder = DirectCast(New FilterGraph,
                IFilterGraph2) 'Load Graph Builder Device

            hr = graphBuilder.RenderFile(fName, Nothing) ' Initialize Graph Builder
            DsError.ThrowExceptionForHR(hr)

            'Load all Interfaces we will use
            mediaControl = DirectCast(graphBuilder, IMediaControl)
            mediaEventEx = DirectCast(graphBuilder, IMediaEventEx)
            mediaSeeking = DirectCast(graphBuilder, IMediaSeeking)
            mediaPosition = DirectCast(graphBuilder, IMediaPosition)
            videoWindow = DirectCast(graphBuilder, IVideoWindow)
            basicAudio = DirectCast(graphBuilder, IBasicVideo)
            basicVideo = DirectCast(graphBuilder, IBasicAudio)

            Call CheckType() 'Check to See if Audio or Video Call

            If isAudioOnly = False Then
                'Notfy Window of Video
                hr = mediaEventEx.SetNotifyWindow(UseHand, WMGraphNotify, IntPtr.Zero)
                DsError.ThrowExceptionForHR(hr)

                'Set Owner to Display Video
                hr = videoWindow.put_Owner(UseHand)
                DsError.ThrowExceptionForHR(hr)

                'Set Owner Video Style
                hr = videoWindow.put_WindowStyle(
                   WindowStyle.Child And WindowStyle.ClipSiblings And WindowStyle.ClipChildren)
                DsError.ThrowExceptionForHR(hr)
            End If

#If DEBUG Then
            rot = New DsROTEntry(graphBuilder)
#End If

            Me.Focus()
            'Update Form Title
            Call SetFormTitle()

            'Start Media
            hr = mediaControl.Run
            DsError.ThrowExceptionForHR(hr)

            currentState = PlayState.Running

            If isAudioOnly = False Then
                'Set Video Size
                hr = VideoWindowSize(1, 1)
                DsError.ThrowExceptionForHR(hr)
            End If
        Catch ex As Exception
            MsgBox("Error " & ex.Message, MsgBoxStyle.Critical, "Error")
            RaiseEvent MedClose()
        End Try
    End Sub

关注点

随意编辑和重新分发源代码。

© . All rights reserved.