Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QMediaPlayer-播放加载到内存中的声音_C++_Qt_Qmediaplayer - Fatal编程技术网

C++ QMediaPlayer-播放加载到内存中的声音

C++ QMediaPlayer-播放加载到内存中的声音,c++,qt,qmediaplayer,C++,Qt,Qmediaplayer,案例1。我成功地用QMediaPlayer播放了如下声音: QMediaPlayer* media = new QMediaPlayer(); media->setMedia("sound.mp3"); media->play(); QFile file("sound.mp3"); file.open(QIODevice::ReadOnly); QByteArray* arr = new QByteArray(file.readAll()); file.close(); QBuff

案例1。我成功地用QMediaPlayer播放了如下声音:

QMediaPlayer* media = new QMediaPlayer();
media->setMedia("sound.mp3");
media->play();
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();
案例2。如果我将声音加载到内存并按如下方式播放,一切都正常:

QMediaPlayer* media = new QMediaPlayer();
media->setMedia("sound.mp3");
media->play();
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
不同的文件时。 在第一种情况下,玩家立即停止。 在第二种情况下,播放机保持状态
PlayingState
QMediaPlayer::BufferedMedia
QMediaPlayer::NoError

文档:

void QMediaPlayer::setMedia(常量QMediaContent&media,QIODevice *stream=Q_NULLPTR)

设置当前媒体源

如果提供了流;媒体数据将从中读取,而不是从中读取 解析媒体源。在这种情况下,媒体源可能仍然是 用于解析有关媒体的其他信息,如mime 类型流必须是开放的和可读的

将媒体设置为空QMediaContent将导致播放机 放弃所有与当前媒体源相关的信息,并删除 停止与该介质相关的所有I/O操作

所以,如果我使用
media->setMedia(QMediaContent(),buffer)
然后mediaplayer将从内存中读取数据,但由于QMediaContent为null,因此没有mime类型的附加信息。可能由于缺少mime类型,mediaplayer仍处于PlayingState状态,试图播放内存中加载的文本文件

因此,我尝试将有效的QMediaContent与加载的数据结合使用。。。同样的结果:mediaplayer保持在PlayingState状态,没有任何错误。
media->setMedia(QMediaContent(QUrl::fromLocalFile(QFileInfo.absoluteFilePath()),缓冲区)


如何使用QMediaPlayer播放加载到内存中的声音以避免此问题?

我知道这是一个旧线程,但我遇到了相同的问题,并找到了一种方法,通过设置wav标头来解决此问题,如下所示:

static QMediaPlayer player;
player.setMedia(QUrl::fromLocalFile("sound.mp3"));
player.play();  
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()));
QMediaPlayer播放器;
QBuffer*buffer=新的QBuffer();
缓冲区->打开(QIODevice::ReadWrite);
缓冲区->搜索(0);
qint8 RIFF[4];//里夫头球魔术头球
qint32文件大小;
qint8波[4];//波头
qint8 fmt[4];//FMT头
qint32 ChunkSize;//RIFF区块大小(长度大于等于16)
qint16音频格式;//音频格式1=PCM,6=mulaw,7=alaw,257=IBM Mu定律,258=IBM A定律,259=ADPCM
qint16 NCh;//通道数1=Mono 2=Sterio
qint32样品处理中心;//采样频率(Hz)
qint32 bytesPerSec;//每秒字节数
qint16块对齐;//2=16位单声道,4=16位立体声
qint16位样本;//每个样本的位数
qint8子chunk2id[4];//“数据”字符串
qint32分块尺寸;//采样数据长度
矢量数据;
矢量波形发生器;
QDataStream out(缓冲区);
out.setVersion(QDataStream::Qt_4_8);
out.setByteOrder(QDataStream::LittleEndian);
setFloatingPointPrecision(QDataStream::SinglePrecision);

你能解释一下为什么这段代码是问题的解决方案吗?虽然这段代码可能是解决方案,但包括一个解释确实有助于提高你文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码的原因。根据我有限的经验,它可以播放一个文件,如果您播放D盘下面的文件,您可以将其替换为“D:\\sound.Mp3”