vlc功能的實現難點?注:本文基于 C 代碼講述 vlc 音視頻播放控制過程,且假設你已經集成好了VLC到你的項目中,下面我們就來聊聊關于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每日頭條,我们将持续为您更新最新资讯!