【问题标题】:More efficient way to find media item in WMP media library?在 WMP 媒体库中查找媒体项目的更有效方法?
【发布时间】:2011-02-12 00:38:58
【问题描述】:

我在使用 .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() 的方法,以便在不遍历整个媒体库(可能很大)的情况下完成它的工作。有人知道吗?

【问题讨论】:

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


    【解决方案1】:

    只是在考虑如何尝试进行更快的搜索。我可能会创建几个后台工作人员,然后在其中一个工作人员中从 0 迭代到 allTracks.count - 1,然后在另一个工作人员中,从 allTracks.count - 1 向下迭代到 0。然后,无论哪个先到达,在RunWorkerCompleted 事件,您可以取消其他工作人员的异步。这可能会将搜索时间缩短一半。

    您还可以同时在列表的四分之一上运行循环,方法是将 (count-1) 除以 4 得到 25%,然后您可以从 (count-1) 中减去它得到 75%,然后向上或向下迭代到另一对异步工作者的中间点。这可以将您的搜索时间减少到之前等待的 25%。

    我看到你正在创建一个类来支持你在对象中的搜索,我不知道 Backgroundworkers 是否真的在类中起作用,所以我可能会离开。

    只是一个想法。我以前没有做过这样的事情,所以我可能会比需要的更难。祝你好运!告诉我你发现了什么。

    编辑:如果您使用后台工作人员,我认为您需要在 for 循环中包含此代码:

    If BackgroundWorker1.CancellationPending Then
        Exit For
    End If
    

    【讨论】:

      【解决方案2】:

      只需使用IWMPMediaCollection接口的“getByName”方法;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        相关资源
        最近更新 更多