在Windows中读取/写入各种音频文件元数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Windows中读取/写入各种音频文件元数据相关的知识,希望对你有一定的参考价值。
我试图用C ++修改一些音频文件的元数据,我遇到了[我认为]使用Windows Media Foundation的可能方式。所以我试着整理一个简单的解决方案:
#include <atlbase.h>
#include <mfapi.h>
#include <mfidl.h>
#include <Windows.h>
#pragma comment(lib, "Mf.lib")
#pragma comment(lib, "Mfplat.lib")
int main() {
HRESULT hr;
CComPtr<IMFSourceResolver> source_resolver(nullptr);
if (FAILED(hr = MFCreateSourceResolver(&source_resolver))) {
// Handle errors...
}
MF_OBJECT_TYPE object_type = MF_OBJECT_INVALID;
CComPtr<IUnknown> source_object(nullptr);
if (FAILED(hr = source_resolver->CreateObjectFromURL(L"audio_file_here", MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_READ | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE, NULL, &object_type, &source_object))) {
// Handle errors...
}
CComPtr<IMFMediaSource> source(nullptr);
if (FAILED(hr = source_object->QueryInterface(IID_PPV_ARGS(&source)))) {
// Handle errors...
}
CComPtr<IMFPresentationDescriptor> presentation_descriptor(nullptr);
if (FAILED(hr = source->CreatePresentationDescriptor(&presentation_descriptor))) {
// Handle errors...
}
CComPtr<IMFMetadataProvider> metadata_prov(nullptr);
if (FAILED(hr = MFGetService(source, MF_METADATA_PROVIDER_SERVICE, IID_PPV_ARGS(&metadata_prov)))) {
// Handle errors...
}
CComPtr<IMFMetadata> metadata(nullptr);
if (FAILED(hr = metadata_prov->GetMFMetadata(presentation_descriptor, 0, NULL, &metadata))) {
// Handle errors...
}
/* Use metadata, etc etc */
}
它适用于标准MP3(.mp3)文件,但它总是在AAC(来自iTunes的.m4a)音频文件上失败。具体来说,MFGetService()
函数失败,返回值由Visual Studio作为"The object does not support the specified service."
给出。
我不明白为什么会这样。正确的here它说媒体基金会支持AAC,Windows肯定会以某种方式支持它,因为我可以通过内置的Groove音乐播放器完美地播放我的AAC文件。 此外,文件元数据也可以通过Windows以某种方式读取,因为我可以在资源管理器中查看文件的属性,它可以很好地列出标题,艺术家,专辑等。
那么如何从MP3和AAC音频文件中读取和写入元数据呢?是否可以通过Media Foundation,还是需要Windows API中的其他工具? (我已经看到参考here到一个涉及“Windows Shell界面”的方法,这是要走的路?)
首先,您的问题实际上与AAC无关。您不在此处执行AAC文件,并且您的文件是MPEG-4文件(通常为.MP4,但您的.M4A只是.MP4的变体/别名)。
所以问题是你是否可以使用MF_METADATA_PROVIDER_SERVICE
或Media Foundation访问MPEG-4文件的元数据。
请注意,“对AAC或MPEG-4的支持”并不一定意味着元数据管理,因为元数据管理毕竟是辅助功能。
似乎Microsoft弃用了元数据提供程序服务,并且不再为新的媒体源提供它。即使对.MP3文件仍然支持MF_METADATA_PROVIDER_SERVICE
,它也不再适用于.MP4。相反,Microsoft建议使用shell属性处理程序,对于MP4文件,它可以在内部使用Media Foundation。
见MF_METADATA_PROVIDER_SERVICE for MP4 file:
要从MP4源获取元数据,您实际上应该从
MF_PROPERTY_HANDLER_SERVICE
服务获取IPropertyStore接口。正在更新MSDN以记录这种检索元数据的新方法......有关信息,请在此处记录标准的Shell属性键:Windows Properties。
Shell和资源管理器使用此方法来检索元数据。
您还可以使用FilePropertyStore中的there工具快速列出通过shell属性处理程序API提供的属性:
以上是关于在Windows中读取/写入各种音频文件元数据的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 AVAudioEngine 从文件中读取,使用音频单元处理并写入文件,比实时更快吗?
premiere 导出文件报错已禁止读取和写入此文件袋元数据。
使用 youtube-dl 将元数据(艺术家姓名、歌曲名称、年份、专辑、时长、流派)写入 mp3/m4a 音频文件(随后的 AtomicParsely 错误)