vlc功能的实现难点(VLC音播放支持添加列表和循环播放)

注:本文基于 C 代码讲述 vlc 音视频播放控制过程,且假设你已经集成好了VLC到你的项目中,下面我们就来聊聊关于vlc功能的实现难点?接下来我们就一起去了解一下吧!

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); //设置音量

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页