// // Created by Administrator on 2023-09-17. // #include "CVlcKit.h" CVlcKit::CVlcKit() = default; CVlcKit::~CVlcKit() { libvlc_media_player_release(m_pMediaPlayer); libvlc_release(m_pInstance); } libvlc_media_player_t *CVlcKit::getPlayerPoint() const { return m_pMediaPlayer; } bool CVlcKit::InitVLC() { m_pInstance = libvlc_new(0, nullptr); if (!m_pInstance) { m_szError = u8"libvlc new failed!"; return false; } m_pMediaPlayer = libvlc_media_player_new(m_pInstance); if (!m_pMediaPlayer) { libvlc_release(m_pInstance); m_szError = u8"libvlc_media_player_new failed!"; return false; } m_event = libvlc_media_player_event_manager(m_pMediaPlayer); libvlc_event_attach(m_event, libvlc_MediaPlayerPositionChanged, vlc_call, this); libvlc_event_attach(m_event, libvlc_MediaPlayerAudioVolume, vlc_call, this); return true; } void CVlcKit::vlc_call(const struct libvlc_event_t *p_event, void *p_data) { auto* pThis = static_cast(p_data); if (!pThis) { return; } switch (p_event->type) { case libvlc_MediaPlayerPositionChanged: { float pos = libvlc_media_player_get_position(pThis->m_pMediaPlayer); emit pThis->sigSetTimeSlider(static_cast(pos * 100)); long long current = libvlc_media_player_get_time(pThis->m_pMediaPlayer) / 1000; emit pThis->sigSetStringTime(current); break; } case libvlc_MediaPlayerAudioVolume: { int vol = libvlc_audio_get_volume(pThis->m_pMediaPlayer); emit pThis->sigSetVolumeSlider(vol); break; } default: break; } } void CVlcKit::stopVideo() { if (!m_pMediaPlayer) { return; } if (libvlc_media_player_get_state(m_pMediaPlayer) == libvlc_state_t::libvlc_Playing) { libvlc_media_player_stop(m_pMediaPlayer); } } void CVlcKit::pauseVideo() { if (!m_pMediaPlayer) { return; } if (libvlc_media_player_get_state(m_pMediaPlayer) == libvlc_state_t::libvlc_Playing) { libvlc_media_player_pause(m_pMediaPlayer); } } void CVlcKit::playVideo() { if (!m_pMediaPlayer) { return; } if (libvlc_media_player_get_state(m_pMediaPlayer) == libvlc_state_t::libvlc_Paused || libvlc_media_player_get_state(m_pMediaPlayer) == libvlc_state_t::libvlc_Stopped) { libvlc_media_player_play(m_pMediaPlayer); } } bool CVlcKit::openVideo(const char* path, void* pWindow) { // 设置路径 m_pMedia = libvlc_media_new_path(m_pInstance, path); if (!m_pMedia) { m_szError = u8"libvlc_media_new_path failed!"; return false; } // 解析media libvlc_media_parse(m_pMedia); // 获取总时长 (ms) m_totalSec = libvlc_media_get_duration(m_pMedia); emit sigSetTotalSecond(m_totalSec / 1000); // 设置media libvlc_media_player_set_media(m_pMediaPlayer, m_pMedia); // 设置播放窗口句柄 libvlc_media_player_set_hwnd(m_pMediaPlayer, pWindow); // 释放media libvlc_media_release(m_pMedia); m_pMedia = nullptr; // 播放视频 libvlc_media_player_play(m_pMediaPlayer); return true; } std::string CVlcKit::getLastError() const { return m_szError; } void CVlcKit::setPlayPostion(float pos) { if (!m_pMediaPlayer) { return ; } libvlc_media_player_set_position(m_pMediaPlayer, static_cast(pos / 100.0)); } void CVlcKit::setVolume(int vol) { if (!m_pMediaPlayer) { return ; } libvlc_audio_set_volume(m_pMediaPlayer, vol); }