簡體   English   中英

QMediaPlayer-播放加載到內存中的聲音

[英]QMediaPlayer - play a sound loaded into memory

情況1。我設法使用QMediaPlayer播放聲音,如下所示:

QMediaPlayer* media = new QMediaPlayer();
media->setMedia("sound.mp3");
media->play();

情況2。如果我將聲音加載到內存中並像這樣播放,一切都還可以:

QFile file("sound.mp3");
file.open(QIODevice::ReadOnly);
QByteArray* arr = new QByteArray(file.readAll());
file.close();
QBuffer* buffer = new QBuffer(arr);
buffer->open(QIODevice::ReadOnly);
buffer->seek(0);
QMediaPlayer* media = new QMediaPlayer();
media->setMedia(QMediaContent(), buffer);
media->play();

問題是當我嘗試播放不是像file.txt類的真實聲音的file.txt 在第一種情況下,播放器立即停止。 在第二種情況下,播放器就保持在狀態PlayingStateQMediaPlayer::BufferedMediaQMediaPlayer::NoError

說明文件:

QMediaPlayer :: setMedia(const QMediaContent&media,QIODevice * stream = Q_NULLPTR)

設置當前媒體源。

如果提供了流; 將從中讀取媒體數據,而不是解析媒體源。 在這種情況下,媒體源仍可用於解析有關媒體的其他信息,例如mime類型。 流必須是開放且可讀的。

將媒體設置為空的QMediaContent將導致播放器丟棄與當前媒體源有關的所有信息,並停止與該媒體有關的所有I / O操作。

因此,如果我使用media->setMedia(QMediaContent(), buffer); 然后,由於QMediaContent為空,媒體播放器將從內存中讀取數據,而沒有其他信息作為mime類型。 也許由於缺少mime類型,mediaplayer仍保留在PlayingState中,試圖播放內存中加載的文本文件。

因此,我嘗試將有效的QMediaContent與加載的數據結合使用...相同的結果:mediaplayer保留在PlayingState中,沒有任何錯誤。 media->setMedia(QMediaContent(QUrl::fromLocalFile(QFileInfo(s).absoluteFilePath())), buffer);

如何使用QMediaPlayer播放加載到內存中的聲音來避免此問題?

我知道這是一個舊線程,但是我遇到了同樣的問題,並找到了一種通過設置wav標頭來變通的方法,如下所示:

QMediaPlayer player;
QBuffer* buffer = new QBuffer();
buffer->open(QIODevice::ReadWrite);
buffer->seek(0);

qint8    RIFF[4];        // RIFF Header Magic header
qint32   wavfilesize;
qint8    WAVE[4];        // WAVE Header
qint8    fmt[4];         // FMT header
qint32   ChunkSize;      // RIFF Chunk Size (length of above = 16)
qint16   AudioFormat;    // Audio format 1=PCM,6=mulaw,7=alaw,     257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
qint16   NCh;      // Number of channels 1=Mono 2=Sterio
qint32   SamplesPerSec;  // Sampling Frequency in Hz
qint32   bytesPerSec;    // bytes per second
qint16   blockAlign;     // 2=16-bit mono, 4=16-bit stereo
qint16   bitsPerSample;  // Number of bits per sample
qint8    Subchunk2ID[4]; // "data"  string
qint32   Subchunk2Size;  // Sampled data length
QVector<qint16> wavDataL;
QVector<qint16> wavDataR;

QDataStream out(buffer);
out.setVersion(QDataStream::Qt_4_8);
out.setByteOrder(QDataStream::LittleEndian);
out.setFloatingPointPrecision(QDataStream::SinglePrecision);
out << RIFF[0] << RIFF[1] << RIFF[2] << RIFF[3]; //4
out << wavfilesize; // 4
out << WAVE[0] << WAVE[1] << WAVE[2] << WAVE[3]; // 4
out << fmt[0] << fmt[1] << fmt[2] << fmt[3]; // 4
out << ChunkSize; // 4
out << AudioFormat ; // 2
out << NCh; // 2
out << SamplesPerSec; // 4
out << bytesPerSec; // 4
out << blockAlign ; // 2
out << bitsPerSample; // 2
out << Subchunk2ID[0] << Subchunk2ID[1] << Subchunk2ID[2] << Subchunk2ID[3]; // 4
out << Subchunk2Size; // 4
if (NCh == 1){
    for(int ii=0; ii<wavDataL.size(); ii++){
        out << wavDataL[ii]; // 2
    }
} else if (NCh == 2){
    for(int ii=0; ii<wavDataL.size(); ii++){
        out << wavDataL[ii];
        out << wavDataR[ii];
    }
}
buffer->seek(0);
player.setMedia(QMediaContent(), buffer);
player.play(); // though I actually played after the media is loaded QObject::connect(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(playClicked()));

我希望這對某些讀者有所幫助。

static QMediaPlayer player;
player.setMedia(QUrl::fromLocalFile("sound.mp3"));
player.play();  

暫無
暫無

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

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