2014-10-15 6 views
2

У меня есть аудиопоток с сервера, который я хочу играть с QMediaPlayer в моей программе. Все работает, когда я сначала загружаю файл в QBuffer, а затем вызываю setMedia и play метод от игрока. Но если я хочу играть музыку, пока поток все еще работает, медиаплеер воспроизводит звук только тогда, когда был вызван метод setMedia, а затем stoppes. Есть ли какие-либо возможные способы заставить его работать, как я хочу? Спасибо.Как воспроизвести потоковое аудио с помощью QMediaPlayer?

+1

Вы пытались построить '' QMediaPlayer' с QMediaPlayer :: StreamPlayback 'option like:' QMediaPlayer * player = new QMediaPlayer (0, QMediaPlayer :: StreamPlayback) '? – Nejat

+0

Я попробовал, и он все еще играет только до позиции, когда вызывалась 'setMedia'. –

+1

Когда вы спрашиваете, почему какой-то код не работает, рекомендуется прикрепить код ... По крайней мере, хороший, соответствующий фрагмент, если не полный [MVCE] (http://stackoverflow.com/help/mcve). – hyde

ответ

2

Я не вижу причин, по которым он не работает, если вы правильно инициализируете игрока.

Поскольку вы не использовали код, который вы написали (также, поскольку я не буду доступен для остальной части дня, чтобы увидеть ваш ответ, если я оставляю комментарий), я оставлю здесь пример кода. Проверьте, подходит ли приведенный ниже код.

QMediaPlayer* player = new QMediaPlayer(this, QMediaPlayer::StreamPlayback); 
player->setMedia(QUrl("http://vpr.streamguys.net/vpr64.mp3")); 
player->setVolume(80); 
player->play(); 

Если это так, попробуйте сделать то же самое, изменив URL-адрес вашего потока.

EDIT: Я предполагаю, что игрок исчерпывает буфер, прежде чем обновлять его. Постарайтесь следить за 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.

+0

Да. Вот как это выглядит. Посмотрите, есть ли [this] (http://stackoverflow.com/questions/21404500/qmediaplayer-streaming-from-a-custom-qiodevice-with-encryption-on-mac-os-10-9) сообщение, чтобы помочь вы. – nnb

+0

Я не уверен, что это будет иметь значение. Но попробуйте передать экземпляр 'QMediaContent' в качестве первого параметра в' QMediaPlayer :: setMedia' вместо 'NULL'. т. е. 'mediaPlayer.setMedia (QMediaContent(), песня);' – nnb

+0

Это может быть возможное объяснение. :) – nnb

0

Via 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

Смежные вопросы