Как использовать IPropertyStore для доступа к метаданным mp3 в Windows с C ++? - PullRequest
3 голосов
/ 25 декабря 2011

Учитывая путь к 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Казалось, что ID3-теги с TagLib - это то, что нужно.Поэтому я написал утилиту, которая отлично работала на нескольких полях.Но потом я обнаружил, что TagLib ограничен небольшим подмножеством из множества возможных полей, и я хочу получить доступ ко всем из них.

Поле, которое меня больше всего интересует, - это Исполнитель альбома, потому что проигрыватель Windows Media использует егокак порядок сортировки по умолчанию, который не может быть изменен.

Я изменил источник TagLib, чтобы получить доступ к исполнителю альбома вместо исполнителя Contributing (путем изменения всех вхождений '\ 251ART' на '\ 141ART'), но это нене работает.

Я уверен, что есть способ, которым все можно сделать с помощью тегов ID3, но я бы не стал полагаться на дополнительные вещи, такие как TagLib, ZLIB и средство CMake.Я хочу использовать IPropertyStore, потому что он встроен, и мне кажется, что проще всего преодолеть это препятствие.

В Интернете я нашел несколько примеров IPropertyStore и попытался помассажироватьбез всякой удачи, чтобы удовлетворить мои потребности, я все еще не уверен,

«Справка» MSDN не очень полезна - никаких спецификаций, примеров - она ​​даже не говорит мне, какой заголовочный файлвключать.Справка MSDN теперь ужасна по сравнению с тем, что было раньше, или я что-то упустил?Без гугла я бы облажался.В любом случае ...

Я надеюсь, что кто-то может показать мне в 3 или 4 строках кода, как создать и инициализировать IPropertyStore для моей цели.Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

Вот ответ:

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

Спасибо Логану Капальдо за указание в правильном направлении. Мне не нужны были эти 2 функции, когда я нашел

SHGetPropertyStoreFromParsingName()
2 голосов
/ 25 декабря 2011

Вкратце, SHParseDisplayName для получения PIDL, который вы можете предоставить SHGetPropertyStoreFromIDList

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762236(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762196(v=vs.85).aspx

...