簡體   English   中英

Qt 6.2: QMediaPlayer & QByteArray

[英]Qt 6.2: QMediaPlayer & QByteArray

再會。 有沒有人在 Qt 6.2 中嘗試過 QMediaPlayer? 我正在嘗試此代碼,但媒體狀態始終保持為“NoMedia”並且沒有任何聲音:)。 完整測試項目: https://github.com/avttrue/MediaPlayerTest

#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
} 

正如文檔指出的那樣:

void QMediaPlayer::setSourceDevice(QIODevice *device, const QUrl &sourceUrl = QUrl())

設置當前源設備。

媒體數據將從設備中讀取。 可以提供 sourceUrl 來解析有關媒體、mime 類型等的附加信息。設備必須是開放的和可讀的。

對於 macOS,設備也應該是可搜索的。

注意:這個function錄制指定媒體源后立即返回。 它不會等待媒體完成加載,也不會檢查錯誤。 監聽 mediaStatusChanged() 和 error() 信號,以便在加載媒體時以及加載過程中是否發生錯誤時收到通知。

(強調我的)

QMediaPlayer 不知道如何推斷文件格式,所以它不會加載它。 解決方法是指出是mp3:

player->setSourceDevice(buffer, QUrl("foo.mp3"));

您正在使用的 function setSourceDevice() 沒有按照您的想法進行操作? 也許你想要 setSource() 而不是?

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

甚至很好的例子:

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

可能這是變體,但我認為這不好:

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()));
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM