libVLC 媒體信息(元數(shù)據(jù))

1
什么是元數(shù)據(jù)
元數(shù)據(jù)可被看作是物體內(nèi)部信息的高級摘要。對于一本書而言,這些數(shù)據(jù)由作者、標題、發(fā)布日期等組成。而對于多媒體,元數(shù)據(jù)是指標題、專輯、藝術家、年代等信息。同樣地,元數(shù)據(jù)也可用于描述其它類型的內(nèi)容,如文檔、圖像、網(wǎng)頁等等。
之所以需要元數(shù)據(jù),是因為這能夠讓物體更容易地被識別、查找、管理和發(fā)現(xiàn)。假如你正在搜索特定類型的曲目,使用元數(shù)據(jù)過濾會十分方便,將藝術家設置為“周杰倫”或者將流派設置為“搖滾”,這時歌曲列表中只會顯示周杰倫的曲目或者搖滾類型的曲目。
所以說,要實現(xiàn)一個多媒體播放器,這些信息是必不可少的。那么,libVLC 究竟如何獲取這些元數(shù)據(jù)呢?并且是否能對這些信息進行更改呢?
2
元數(shù)據(jù)類型
在 libVLC 中,元數(shù)據(jù)類型由枚舉類型 libvlc_meta_t 表示,它的各個值和含義如下:
| 枚舉 | 含義 |
|---|---|
| libvlc_meta_Title | 標題 |
| libvlc_meta_Artist | 藝術家 |
| libvlc_meta_Genre | 流派 |
| libvlc_meta_Copyright | 版權(quán) |
| 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 | 發(fā)行商 |
| libvlc_meta_EncodedBy | 編碼者 |
| libvlc_meta_ArtworkURL | 專輯圖片地址 |
| libvlc_meta_TrackID | 軌道 ID |
| libvlc_meta_TrackTotal | 軌道總數(shù) |
| libvlc_meta_Director | 導演 |
| libvlc_meta_Season | 第幾季 |
| libvlc_meta_Episode | 插曲 |
| libvlc_meta_ShowName | 顯示名 |
| libvlc_meta_Actors | 表演者 |
| libvlc_meta_AlbumArtist | 專輯藝術家 |
| libvlc_meta_DiscNumber | 碟號 |
| libvlc_meta_DiscTotal | 總碟數(shù) |
隨著 libVLC 的版本更新,這個列表將來有可能會更改。
3
讀取媒體信息
要獲取媒體信息,我們需要監(jiān)聽 libvlc_MediaParsedChanged 事件(可參考《libVLC 事件機制》),并通過 libvlc_media_parse_with_options() 解析媒體。
由于測試的?本地媒體,所以第二個參數(shù)使用 libvlc_media_parse_local;倘若是網(wǎng)絡資源,替換為 libvlc_media_parse_network:
//?創(chuàng)建事件管理器
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(),這兩個接口已經(jīng)被遺棄了,取而代之的是 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:?"?<endl;
????if?(nullptr?!=?artist)
????????cout?<"artist:?"?<endl;
????if?(nullptr?!=?album)
????????cout?<"album:?"?<endl;
}
如果想獲取其他媒體信息,方法類似!
4
更改媒體信息
可以通過 libvlc_media_set_meta() 來設置媒體信息,但該方法并不會保存數(shù)據(jù),還需要調(diào)用 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·
?
點個在看,么么噠!

