libVLC 媒体信息(元数据)
共 2333字,需浏览 5分钟
·
2020-08-23 14:03
1
什么是元数据
元数据可被看作是物体内部信息的高级摘要。对于一本书而言,这些数据由作者、标题、发布日期等组成。而对于多媒体,元数据是指标题、专辑、艺术家、年代等信息。同样地,元数据也可用于描述其它类型的内容,如文档、图像、网页等等。
之所以需要元数据,是因为这能够让物体更容易地被识别、查找、管理和发现。假如你正在搜索特定类型的曲目,使用元数据过滤会十分方便,将艺术家设置为“周杰伦”或者将流派设置为“摇滚”,这时歌曲列表中只会显示周杰伦的曲目或者摇滚类型的曲目。
所以说,要实现一个多媒体播放器,这些信息是必不可少的。那么,libVLC 究竟如何获取这些元数据呢?并且是否能对这些信息进行更改呢?
2
元数据类型
在 libVLC 中,元数据类型由枚举类型 libvlc_meta_t 表示,它的各个值和含义如下:
枚举 | 含义 |
---|---|
libvlc_meta_Title | 标题 |
libvlc_meta_Artist | 艺术家 |
libvlc_meta_Genre | 流派 |
libvlc_meta_Copyright | 版权 |
libvlc_meta_Album | 专辑 |
libvlc_meta_TrackNumber | 轨道编号 |
libvlc_meta_Description | 描述 |
libvlc_meta_Rating | 评分 |
libvlc_meta_Date | 日期 |
libvlc_meta_Setting | 设置 |
libvlc_meta_URL | 地址 |
libvlc_meta_Language | 语言 |
libvlc_meta_NowPlaying | 正在播放 |
libvlc_meta_Publisher | 发行商 |
libvlc_meta_EncodedBy | 编码者 |
libvlc_meta_ArtworkURL | 专辑图片地址 |
libvlc_meta_TrackID | 轨道 ID |
libvlc_meta_TrackTotal | 轨道总数 |
libvlc_meta_Director | 导演 |
libvlc_meta_Season | 第几季 |
libvlc_meta_Episode | 插曲 |
libvlc_meta_ShowName | 显示名 |
libvlc_meta_Actors | 表演者 |
libvlc_meta_AlbumArtist | 专辑艺术家 |
libvlc_meta_DiscNumber | 碟号 |
libvlc_meta_DiscTotal | 总碟数 |
随着 libVLC 的版本更新,这个列表将来有可能会更改。
3
读取媒体信息
要获取媒体信息,我们需要监听 libvlc_MediaParsedChanged 事件(可参考《libVLC 事件机制》),并通过 libvlc_media_parse_with_options() 解析媒体。
由于测试的 本地媒体,所以第二个参数使用 libvlc_media_parse_local;倘若是网络资源,替换为 libvlc_media_parse_network:
// 创建事件管理器
eventManager = libvlc_media_event_manager(media);
// 订阅事件
libvlc_event_attach(eventManager, libvlc_MediaParsedChanged, handleEvents, nullptr);
// 解析媒体(用于获取媒体信息,比如:艺术家、专辑等)
libvlc_media_parse_with_options(media, libvlc_media_parse_local, 1000);
注意:在解析媒体信息时,不建议使用 libvlc_media_parse() 或者 libvlc_media_parse_async(),这两个接口已经被遗弃了,取而代之的是 libvlc_media_parse_with_options()。
然后,就可以在事件处理程序中读取媒体信息了:
static void handleEvents(const libvlc_event_t *event, void *userData)
{
switch (event->type) {
case libvlc_MediaParsedChanged: {
int state = event->u.media_parsed_changed.new_status;
if (libvlc_media_parsed_status_done == state)
getMeta(media);
break;
}
default:
break;
}
}
具体的读取由 libvlc_media_get_meta() 完成,以标题、艺术家、专辑为例:
void getMeta(libvlc_media_t *media)
{
// 读取标题、艺术家、专辑
char *title = libvlc_media_get_meta(media, libvlc_meta_Title);
char *artist = libvlc_media_get_meta(media, libvlc_meta_Artist);
char *album = libvlc_media_get_meta(media, libvlc_meta_Album);
if (nullptr != title)
cout << "title: " << title << endl;
if (nullptr != artist)
cout << "artist: " << artist << endl;
if (nullptr != album)
cout << "album: " << album << endl;
}
如果想获取其他媒体信息,方法类似!
4
更改媒体信息
可以通过 libvlc_media_set_meta() 来设置媒体信息,但该方法并不会保存数据,还需要调用 libvlc_media_save_meta() 才行:
// 设置媒体信息
libvlc_media_set_meta(media, libvlc_meta_Title, "Title");
libvlc_media_set_meta(media, libvlc_meta_Artist, "Artist");
libvlc_media_set_meta(media, libvlc_meta_Album, "Album");
// 进行保存
libvlc_media_save_meta(media);
5
测试程序
运行程序,可以看到输出的媒体信息,如下所示:
·END·