it's work with vlc
#pragma once
#include <QObject>
#include <vlc/vlc.h>
#include <QString>
#include <QUrl>
#include <QTimer>
class VlcAudioPlayer : public QObject
{
Q_OBJECT
public:
explicit VlcAudioPlayer(QObject* parent = nullptr);
~VlcAudioPlayer();
// Запустить воспроизведение аудиофайла по локальному пути
bool play(const QString& filePath);
// Остановить воспроизведение
void stop();
// Проверить, играет ли сейчас аудио
bool isPlaying() const;
signals:
void started();
void stopped();
void finished();
private slots:
void checkPlayback();
private:
libvlc_instance_t* m_instance = nullptr;
libvlc_media_player_t* m_mediaPlayer = nullptr;
QTimer m_timer;
};
#include "VlcAudioPlayer.h"
#include <QDebug>
VlcAudioPlayer::VlcAudioPlayer(QObject* parent)
: QObject(parent)
{
const char* args[] = { "--no-xlib" };
m_instance = libvlc_new(1, args);
if (!m_instance) {
qWarning() << "Failed to create libVLC instance";
}
m_mediaPlayer = nullptr;
// Таймер для проверки состояния воспроизведения
connect(&m_timer, &QTimer::timeout, this, &VlcAudioPlayer::checkPlayback);
m_timer.setInterval(200); // проверять каждые 200 мс
}
VlcAudioPlayer::~VlcAudioPlayer()
{
if (m_mediaPlayer) {
libvlc_media_player_stop(m_mediaPlayer);
libvlc_media_player_release(m_mediaPlayer);
}
if (m_instance) {
libvlc_release(m_instance);
}
}
bool VlcAudioPlayer::play(const QString& filePath)
{
if (!m_instance) {
qWarning() << "libVLC instance is null";
return false;
}
// Если уже играет, остановим
if (isPlaying()) {
stop();
}
// Преобразуем путь в URI
QUrl url = QUrl::fromLocalFile(filePath);
QString uri = url.toString();
libvlc_media_t* media = libvlc_media_new_location(m_instance, uri.toUtf8().constData());
if (!media) {
qWarning() << "Failed to create media from URI:" << uri;
return false;
}
if (m_mediaPlayer) {
libvlc_media_player_stop(m_mediaPlayer);
libvlc_media_player_release(m_mediaPlayer);
m_mediaPlayer = nullptr;
}
m_mediaPlayer = libvlc_media_player_new_from_media(media);
libvlc_media_release(media);
if (!m_mediaPlayer) {
qWarning() << "Failed to create media player";
return false;
}
if (libvlc_media_player_play(m_mediaPlayer) != 0) {
qWarning() << "Failed to start playback";
libvlc_media_player_release(m_mediaPlayer);
m_mediaPlayer = nullptr;
return false;
}
emit started();
m_timer.start();
return true;
}
void VlcAudioPlayer::stop()
{
if (m_mediaPlayer && isPlaying()) {
libvlc_media_player_stop(m_mediaPlayer);
emit stopped();
}
m_timer.stop();
}
bool VlcAudioPlayer::isPlaying() const
{
if (!m_mediaPlayer)
return false;
return libvlc_media_player_is_playing(m_mediaPlayer) != 0;
}
void VlcAudioPlayer::checkPlayback()
{
if (!m_mediaPlayer) {
m_timer.stop();
return;
}
if (!isPlaying()) {
m_timer.stop();
emit finished();
}
}