【问题标题】:How do I use IPropertyStore to access mp3 metadata in Windows with C++?如何使用 IPropertyStore 在 Windows 中使用 C++ 访问 mp3 元数据?
【发布时间】:2012-01-27 14:52:50
【问题描述】:

给定一个 mp3 文件的路径,

如何创建和初始化 IPropertyStore 对象以操作该文件的元数据?

具体来说,我如何从这里获得:

"C:\\Music\\Viva Las Vegas.mp3"

到这里:

store->GetValue(PKEY_Music_AlbumArtist, &variant);

这里有一些伪代码来帮助澄清我想要做什么:

#include "stdafx.h"
#include <propsys.h>
#include <propkey.h>

void main ()
{
    // property store must somehow represent the mp3 file
    IPropertyStore* store = "C:\\Music\\Viva Las Vegas.mp3"; // HELP!
    PROPVARIANT variant;

    // get the existing album artist
    store->GetValue(PKEY_Music_AlbumArtist, &variant);
    assert(variant== "Elvis Presley");

    // set it to something else
    variant= "ZZ Top";
    store->SetValue(PKEY_Music_AlbumArtist, variant);
}

背景

也许有更好的语言可以做到这一点,但我想使用 C++(说来话长)。

最初,在研究了 mp3 元数据之后,似乎使用 TagLib 的 ID3 标签是要走的路。因此,我编写了一个在几个领域都可以正常工作的实用程序。但后来我发现 TagLib 仅限于许多可能字段的一小部分,我想访问所有这些字段。

我最关心的字段是专辑艺术家,因为 Windows Media Player 使用它作为无法更改的默认排序顺序。

我修改了 TagLib 源以访问专辑艺术家而不是贡献艺术家(通过将所有出现的 '\251ART' 更改为 '\141ART')但它不起作用。

我确信有一种方法可以使用 ID3 标签完成所有工作,但我宁愿不依赖于 TagLib、ZLIB 和 CMake 工具等额外的东西。我想使用 IPropertyStore,因为它是内置的,如果我能克服这个障碍,这似乎是最简单的方法。

我在网上找到了一些 IPropertyStore 的示例,我尝试按摩它们以满足我的需要,但没有任何运气,我仍然感到困惑。

MSDN“帮助”没有一点帮助——没有规范,没有示例——它甚至没有告诉我要包含哪个头文件。与以前相比,MSDN 帮助现在很糟糕,还是我遗漏了什么?没有谷歌我会被搞砸的。反正...

我希望有人可以用 3 或 4 行代码向我展示如何为我的目的创建和初始化 IPropertyStore。提前致谢。

【问题讨论】:

    标签: c++ windows mp3 metadata


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      答案如下:

      #include <shobjidl.h>   // SHGetPropertyStoreFromParsingName, etc
      #include <propkey.h>    // PKEY_Music_AlbumArtist
      #include <propvarutil.h>// InitPropVariantFromString, needs shlwapi.lib
      
      void main() // error-checking removed
      {
          // initialize the COM library
          CoInitialize(NULL);
      
          // get a property store for the mp3 file
          IPropertyStore* store = NULL;
          SHGetPropertyStoreFromParsingName(L"C:\\Music\\Viva Las Vegas.mp3", 
              NULL, GPS_READWRITE, __uuidof(IPropertyStore), (void**)&store);
      
          // get the existing album artist ("Elvis Presley")
          PROPVARIANT variant;
          store->GetValue(PKEY_Music_AlbumArtist, &variant);
      
          // set it to something else
          InitPropVariantFromString(L"ZZ Top", &variant);
          store->SetValue(PKEY_Music_AlbumArtist, variant);
          store->Commit();
      
          // very important undocumented method
          store->Release();
      }
      

      感谢 Logan Capaldo 为我指明了正确的方向。我发现时不需要这两个功能

      SHGetPropertyStoreFromParsingName()
      

      【讨论】:

        猜你喜欢
        • 2010-09-05
        • 1970-01-01
        • 2011-03-16
        • 2011-05-29
        • 2017-09-18
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 2016-01-05
        相关资源
        最近更新 更多