再會。有人已經在 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
}
uj5u.com熱心網友回復:
正如檔案指出的那樣:
void QMediaPlayer::setSourceDevice(QIODevice *device, const QUrl &sourceUrl = QUrl())
設定當前源設備。
媒體資料將從設備中讀取。可以提供 sourceUrl 來決議有關媒體、mime 型別等的附加資訊。設備必須是開放的和可讀的。
對于 macOS,設備也應該是可搜索的。
注意:此函式在錄制指定的媒體源后立即回傳。它不會等待媒體完成加載,也不會檢查錯誤。偵聽 mediaStatusChanged() 和 error() 信號以在媒體加載時收到通知,以及加載程序中是否發生錯誤。
(強調我的)
QMediaPlayer 不知道如何推斷檔案格式,因此它不會加載它。解決辦法是指出它是一個mp3:
player->setSourceDevice(buffer, QUrl("foo.mp3"));
uj5u.com熱心網友回復:
您正在使用的函式 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
uj5u.com熱心網友回復:
可能這是變體,但我認為它不好:
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()));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/313882.html
下一篇:如何翻譯快捷鍵
