首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QT6.2: QMediaPlayer & QByteArray

QT6.2: QMediaPlayer & QByteArray
EN

Stack Overflow用户
提问于 2021-10-07 12:01:19
回答 2查看 591关注 0票数 2

日安。有人在QT6.2中尝试过QMediaPlayer吗?我正在尝试这段代码,但是媒体状态始终保持为"NoMedia“,没有任何声音:)。全面测试项目:https://github.com/avttrue/MediaPlayerTest

代码语言:javascript
运行
复制
#include "mainwindow.h"

#include <QDebug>
#include <QBuffer>
#include <QFile>
#include <QAudioOutput>
#include <QMediaPlayer>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QFile file("../test/Bankrobber.mp3");
    if(!file.open(QIODevice::ReadOnly))
        qDebug() << "File not opened";
    qDebug() << "File size:" << file.size(); // File size: 11181085

    QByteArray ba = file.readAll();
    qDebug() << "ByteArray size:" << ba.size(); // ByteArray size: 11181085

    QBuffer* buffer = new QBuffer(this);
    buffer->setData(ba);
    if(!buffer->open(QIODevice::ReadOnly))
        qDebug() << "Buffer not opened";
    qDebug() << "Buffer size:" << buffer->size(); // Buffer size: 11181085

    buffer->seek(qint64(0));

    auto audioOutput = new QAudioOutput(this);
    auto player = new QMediaPlayer(this);
    player->setAudioOutput(audioOutput);
    audioOutput->setVolume(50);
    player->setSourceDevice(buffer);
    qDebug() << "Device:" << player->sourceDevice(); // Device: QBuffer(0x563180493020)

    QObject::connect(player, &QMediaPlayer::mediaStatusChanged,
                     [=](QMediaPlayer::MediaStatus status)
    { qDebug() << "MediaStatus:" << player->mediaStatus() << "|" << status; });

    QObject::connect(player, &QMediaPlayer::errorOccurred,
                     [=](QMediaPlayer::Error error)
    { qDebug() << "Error:" << player->errorString() << "|" << error; });

    QObject::connect(player, &QMediaPlayer::playbackStateChanged,
                     [=](QMediaPlayer::PlaybackState state)
    { qDebug() << "PlaybackState:" << player->playbackState() << "|" << state; });

    player->play();
    qDebug() << "MediaStatus:" << player->mediaStatus(); // MediaStatus: QMediaPlayer::NoMedia
} 
EN

回答 2

Stack Overflow用户

发布于 2021-10-07 13:20:32

您使用的函数setSourceDevice()没有执行您认为的操作?也许你想要setSource()代替?

Qt有很好的文档:https://doc.qt.io/qt-6/qmediaplayer.html#setSourceDevice

即使是很好的例子:

代码语言:javascript
运行
复制
player = new QMediaPlayer;
audioOutput = new QAudioOutput;
player->setAudioOutput(audioOutput);
connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
player->setSource(QUrl::fromLocalFile("/Users/me/Music/coolsong.mp3"));
audioOutput->setVolume(50);
player->play();

参考https://doc.qt.io/qt-6/qmediaplayer.html#details

票数 0
EN

Stack Overflow用户

发布于 2021-10-07 14:24:06

也许这是变体,但我认为这并不好:

代码语言:javascript
运行
复制
QTemporaryFile tfile;
if (!tfile.open())
     qDebug() << "TemporaryFile not opened";
 else
 {
     qDebug() << "TemporaryFile writed:" << tfile.write(ba);
     if(tfile.size() != ba.size())
         qDebug() << "TemporaryFile not complited";
     else
         player->setSource(QUrl::fromLocalFile(tfile.fileName()));
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69480783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档