我有来自服务器的音频流,我想在我的程序中使用QMediaPlayer
。当我第一次将文件下载到QBuffer
,然后从播放器调用setMedia
和play
方法时,一切正常。但是,如果我想在流仍在工作时播放音乐,则媒体播放器仅在调用setMedia
方法然后停止时播放声音。
有没有什么方法可以让它像我想的那样工作?谢谢。
答案 0 :(得分:2)
如果你以正确的方式初始化播放器,我认为没有理由不工作。
由于您还没有共享您编写的代码(因为如果我发表评论,我将在当天剩下的时间内无法查看您的回复),我将在此处留下一些示例代码。 看看下面的代码是否适合您。
QMediaPlayer* player = new QMediaPlayer(this, QMediaPlayer::StreamPlayback);
player->setMedia(QUrl("http://vpr.streamguys.net/vpr64.mp3"));
player->setVolume(80);
player->play();
如果是,请通过将网址更改为您的网址来尝试相同的操作。
编辑:我假设播放器在更新之前耗尽了缓冲区。请密切关注bufferStatus
和QMediaPlayer::MediaStatus
。
我引用了documentation:
bufferStatus : const int
This property holds the percentage of the temporary buffer filled before playback begins or resumes, from (empty) to (full).
When the player object is buffering; this property holds the percentage of the temporary buffer that is filled. The buffer will need to reach 100% filled before playback can start or resume, at which time mediaStatus() will return BufferedMedia or BufferingMedia. If the value is anything lower than 100, mediaStatus() will return StalledMedia.
答案 1 :(得分:0)
通过QAudioOutput:
QByteArray* yourSoundData = blah blah...;
QBuffer* buffer = new QBuffer;
buffer->setData(yourSoundData);
buffer->open(QBuffer::ReadOnly);
QAudioFormat format; // According to your sound format (e.g. wav)
format.setSampleRate(22050);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/wav");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::SignedInt);
QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
if (!info.isFormatSupported(format)) {
qWarning() << "Raw audio format not supported by backend, cannot play audio.";
return;
}
QAudioOutput* audio = new QAudioOutput(format, this);
audio->start(buffer);