如何使用 QMediaPlayer 播放流媒体音频?

Posted

技术标签:

【中文标题】如何使用 QMediaPlayer 播放流媒体音频?【英文标题】:How to play streaming audio with QMediaPlayer? 【发布时间】:2014-10-15 10:39:49 【问题描述】:

我有来自服务器的音频流,我想在我的程序中使用QMediaPlayer 播放。当我首先将文件下载到QBuffer 然后从播放器调用setMediaplay 方法时,一切正常。但是如果我想在流仍在工作时播放音乐,媒体播放器只会在调用 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 更改为您的流来尝试相同的操作。

编辑:我假设玩家在更新之前已经耗尽了缓冲区。试着留意bufferStatusQMediaPlayer::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 播放流媒体音频?的主要内容,如果未能解决你的问题,请参考以下文章

如何播放 amr 音频,QMediaPlayer 不支持?

HMI-55-多媒体音乐播放器 4

使用 QMediaPlayer 进行音频可视化

PyQt5:QMediaPlayer 无法从 QBuffer 重放音频

8.2.1 QMediaPlayer类介绍与基本使用

QMediaPlayer setPlaybackRate > 1 导致高音音频