gpt4 book ai didi

c++ - 如何使用 IPropertyStore 通过 C++ 在 Windows 中访问 mp3 元数据?

转载 作者:可可西里 更新时间:2023-11-01 14:45:48 30 4
gpt4 key购买 nike

给定一个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。提前致谢。

最佳答案

答案如下:

#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()

关于c++ - 如何使用 IPropertyStore 通过 C++ 在 Windows 中访问 mp3 元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8629718/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com