如何使用 QMediaPlayer 播放流媒体音频?
Posted
技术标签:
【中文标题】如何使用 QMediaPlayer 播放流媒体音频?【英文标题】:How to play streaming audio with QMediaPlayer? 【发布时间】:2014-10-15 10:39:49 【问题描述】:我有来自服务器的音频流,我想在我的程序中使用QMediaPlayer
播放。当我首先将文件下载到QBuffer
然后从播放器调用setMedia
和play
方法时,一切正常。但是如果我想在流仍在工作时播放音乐,媒体播放器只会在调用 setMedia
方法然后停止时播放声音。
有没有可能让它像我想要的那样工作?谢谢。
【问题讨论】:
您是否尝试过使用QMediaPlayer::StreamPlayback
选项构造QMediaPlayer
,例如:QMediaPlayer * player = new QMediaPlayer(0,QMediaPlayer::StreamPlayback)
?
我试过了,它仍然只播放到调用setMedia
的位置。
当你问为什么有些代码不起作用时,附上代码是个好主意……至少是一个好的,相关的sn-p,如果不是完整的MVCE。跨度>
是的,你是对的,对不起。
【参考方案1】:
如果您以正确的方式初始化播放器,我认为它没有理由不工作。
由于您尚未共享您编写的代码(另外,如果我发表评论,我将在剩下的时间里无法查看您的回复),我将在此处留下一些示例代码。 看看下面的代码是否适合你。
QMediaPlayer* player = new QMediaPlayer(this, QMediaPlayer::StreamPlayback);
player->setMedia(QUrl("http://vpr.streamguys.net/vpr64.mp3"));
player->setVolume(80);
player->play();
如果是这样,请通过将 URL 更改为您的流来尝试相同的操作。
编辑:我假设玩家在更新之前已经耗尽了缓冲区。试着留意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.
【讨论】:
是的。这就是它的样子。看看this这个帖子对你有没有帮助。 我不确定这是否会有所不同。但是尝试将QMediaContent
实例作为第一个参数传递给QMediaPlayer::setMedia
而不是NULL
。即mediaPlayer.setMedia(QMediaContent(), song);
这可能是一个可能的解释。 :)【参考方案2】:
通过 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);
更多信息:http://doc.qt.io/qt-5/qaudiooutput.html
【讨论】:
以上是关于如何使用 QMediaPlayer 播放流媒体音频?的主要内容,如果未能解决你的问题,请参考以下文章