У меня есть аудиопоток с сервера, с которым я хочу играть QMediaPlayer
в моей программе. Все работает, когда я впервые загружаю файл в QBuffer
а затем позвоните setMedia
а также play
метод от игрока. Но если я хочу воспроизводить музыку, пока потоковая передача еще работает, медиаплеер воспроизводит звук только до setMedia
метод был вызван, а затем остановился.
Есть ли возможные способы заставить его работать так, как я хочу? Спасибо.
Я не вижу причин, по которым это не сработает, если вы правильно инициализируете плеер.
Поскольку вы не поделились написанным кодом (также, поскольку я не буду доступен до конца дня, чтобы увидеть ваш ответ, если я оставлю комментарий), я оставлю здесь пример кода.
Посмотрите, работает ли приведенный ниже код для вас.
QMediaPlayer* player = new QMediaPlayer(this, QMediaPlayer::StreamPlayback);
player->setMedia(QUrl("http://vpr.streamguys.net/vpr64.mp3"));
player->setVolume(80);
player->play();
Если это так, попробуйте то же самое, изменив ссылку на ваш поток.
РЕДАКТИРОВАТЬ: я предполагаю, что игрок исчерпал буфер, прежде чем вы обновите его. Попробуйте следить за bufferStatus
а также QMediaPlayer::MediaStatus
,
Я цитирую документация:
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.
Через 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