libVLC 媒体信息(元数据)

高效程序员

共 2248字,需浏览 5分钟

 · 2020-07-10

60b6259e6dcdbde9a61810b8f4a38d1f.webp

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

测试程序


运行程序,可以看到输出的媒体信息,如下所示:


df0e8652fa0937c3ac762e3c4c611f90.webp


·END·
 

作者:一去、二三里爱学习,爱编程,爱生活。欢迎来撩,一起畅谈程序人生!

点个在看,么么哒!

8fb812a73a2b66466fcd4e8ab62a6517.webp
浏览 48
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报