tft每日頭條

 > 科技

 > vlc功能的實現難點

vlc功能的實現難點

科技 更新时间:2024-12-22 10:11:49

vlc功能的實現難點?注:本文基于 C 代碼講述 vlc 音視頻播放控制過程,且假設你已經集成好了VLC到你的項目中,下面我們就來聊聊關于vlc功能的實現難點?接下來我們就一起去了解一下吧!

vlc功能的實現難點(VLC音播放支持添加列表和循環播放)1

vlc功能的實現難點

注:本文基于 C 代碼講述 vlc 音視頻播放控制過程,且假設你已經集成好了VLC到你的項目中。

C Linux服務器開發學習資料:點擊領取→C Linux服務器開發高級架構師資料

一、初始化

像播放單個視頻一樣,首先我們需要初始化 instance

libvlc_instance_t m_vlc = libvlc_new(0, 0);

而不同于播放單個視頻,我們需要的是 libvlc_media_player_t 實例,但是它隻支持播放單個媒體,因此我們需要初始化另外一個實例 libvlc_media_list_player_t,它支持列表播放。但同時,libvlc_media_player_t 實例也是不可或缺的,因為它代表了我們列表中的正在播放的媒體。

libvlc_media_player_t m_mediaplayer = libvlc_media_player_new(m_vlc); libvlc_media_list_player_t m_listplayer = libvlc_media_list_player_new(m_vlc);

之後我們還需要一個不同于單個媒體 libvlc_media_t 的 libvlc_media_list_t 實例,保存了我們的列表媒體。

libvlc_media_list_t m_medialist = libvlc_media_list_new(m_vlc);

二、設置媒體列表

基礎對象初始化工作完成之後,接下來我們需要将具體的媒體文件添加到我們的播放器中。

void NovaVlcAudio::setMediaList(std::vector<std::string> paths) { for (int i = 0; i < paths.size(); i ) { QString str = QString::fromStdString(paths[i]); libvlc_media_t *m_media = libvlc_media_new_path(m_vlc, str.toUtf8().replace("/", "\\").data()); libvlc_media_list_add_media(m_medialist, m_media); libvlc_media_parse(m_media); m_durationMS = libvlc_media_get_duration(m_media); libvlc_media_release(m_media); } libvlc_media_list_player_set_media_list(m_listplayer, m_medialist); libvlc_media_list_player_set_media_player(m_listplayer, m_mediaplayer); }

我們用 for 循環模拟添加媒體列表。對于本地文件,我們用 libvlc_media_new_path 生成媒體對象,然後通過 libvlc_media_list_add_media 方法将其添加到我們的媒體列表對象中。libvlc_media_parse 方法是為了獲取媒體時長,完成後将其release。媒體列表添加完成後又将其通過 libvlc_media_list_player_set_media_list 設置給列表播放器,最後我們大多數情況下都是對 m_listplayer 進行操作,獲取播放狀态等等。而後面 libvlc_media_list_player_set_media_player 這個方法的目的就是由 m_mediaplayer 代表播放列表中當前正在播放的媒體播放器,可通過 m_mediaplayer 獲取單個媒體的播放進度,音量等。

C 音視頻開發學習資料:點擊領取→音視頻開發(資料文檔 視頻教程 面試題)(FFmpeg WebRTC RTMP RTSP HLS RTP)

三、常用方法

該做的工作完成之後我們就可以通過下面的play方法進行播放了。

libvlc_media_list_player_play(m_listplayer); //播放

//typedef enum libvlc_state_t //{ // libvlc_NothingSpecial=0, // libvlc_Opening, // libvlc_Buffering, /* XXX: Deprecated value. Check the // * libvlc_MediaPlayerBuffering event to know the // * buffering state of a libvlc_media_player */ // libvlc_Playing, // libvlc_Paused, // libvlc_Stopped, // libvlc_Ended, // libvlc_Error //} libvlc_state_t; libvlc_state_t t = libvlc_media_list_player_get_state(m_listplayer); //獲取播放狀态

if (libvlc_media_list_player_is_playing(m_listplayer)) { libvlc_media_list_player_pause(m_listplayer); } //暫停

libvlc_media_list_player_stop(m_listplayer); //停止

float pos = libvlc_media_player_get_position(m_mediaplayer); //pos is 0.01~0.99 1.0 獲取當前媒體的播放進度(注意不是index)

//typedef enum libvlc_playback_mode_t //{ // libvlc_playback_mode_default, // libvlc_playback_mode_loop, /* 循環 */ // libvlc_playback_mode_repeat /* 單個重複 */ //} libvlc_playback_mode_t; libvlc_media_list_player_set_playback_mode(m_listplayer, mode); //設置播放模式

libvlc_audio_set_volume(m_mediaplayer, volume); //設置音量

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved