在WMP媒体库中查找媒体项的更有效方法?

时间:2010-04-25 04:55:44

标签: .net vb.net com interop windows-media-player

我正在使用.NET Framework 3.5 SP1在VB.NET中使用Windows Media Player 12(wmp.dll)提供的WMPLib组件。

我正在尝试根据媒体库的名称从媒体库中检索媒体项(假设没有重复的名称)。目前,我正在抓取整个媒体库,并遍历每个媒体项目,并在找到正确的媒体项目时退出循环。这很有效(除了找不到具有该名称的媒体项目),但我希望有一种更有效的方法。

到目前为止,这是我的代码:

Public Class WMPTest
    Private myWMP As WMPLib.IWMPCore
    Private myMediaCollection As WMPLib.IWMPMediaCollection
    Private myTrack As WMPLib.IWMPMedia
    Private allTracks As WMPLib.IWMPPlaylist

    Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        myWMP = New WMPLib.WindowsMediaPlayer
        myMediaCollection = myWMP.mediaCollection
        allTracks = myMediaCollection.getAll

        Dim theTrack As WMPLib.IWMPMedia = findTrack("Yellow Submarine")
        MessageBox.Show(theTrack.name)
    End Sub

    Public Function findTrack(ByVal strTrackName As String) As WMPLib.IWMPMedia
        For i As Integer = 0 To (allTracks.count - 1)
            If allTracks.Item(i).name = strTrackName Then
                myTrack = allTracks.Item(i)
                Exit For
            End If
        Next
        'myTrack is now the track that we wanted to retrieve
        Return myTrack
    End Function
End Class

所以我真正想要的是一种优化findTrack()来完成它的工作而不需要遍历整个媒体库(这可能是巨大的)的方法。任何人都有线索?

2 个答案:

答案 0 :(得分:1)

考虑如何尝试进行更快速的搜索。我可能会创建一对背景工作者,然后从0到allTracks.count - 在其中一个工作者中迭代,然后在另一个工作程序中迭代,从allTracks.count迭代 - 1到0.然后,无论哪个先到达它,在RunWorkerCompleted事件中,您可以取消对其他worker的异步。这可能会将搜索时间缩短一半。

您还可以通过将(计数-1)除以4(25%)同时在列表的四分之一上运行循环,然后您可以将它从(计数-1)中减去75%,然后向上或向下迭代在另一对异步工人的中途点。这可能会将您的搜索时间减少到之前等待的25%。

我看到你正在创建一个类来支持你在对象中搜索,我不知道Backgroundworkers是否实际上在类内部运行,所以我可以离开。

只是一个想法。我之前没有做过这样的事情,所以我可能会比它需要的更努力。祝好运!让我知道你发现了什么。

编辑:如果你选择后台工作者,我认为你需要在for循环中包含这些代码:

If BackgroundWorker1.CancellationPending Then
    Exit For
End If

答案 1 :(得分:0)

只需使用getByName界面的“IWMPMediaCollection”方法;)