Получить потоковые данные из Qt QMediaPlayer

Я использую QMediaPlayer играть онлайн mp3, и я хочу скачать все данные mp3, когда буфер заполнен. Но единственная функция, связанная с этим setMedia(const QMediaContent & media, QIODevice * stream = 0),

И указатель потока используется для ввода данных. Поэтому я пытаюсь использовать QReply как его аргумент. И он терпит неудачу абсолютно.

QNetworkRequest request;
request.setUrl((QUrl(source)));
pReply = mgr.get(request);
setMedia(QUrl(),pReply);

mgr это QNetworkAccessManager, а источником является онлайн-адрес mp3.

У меня вопрос: есть ли способ получить музыкальные данные? Является setMedia может сделать это?

--------------------------Обновить----------------

Я соединяю ответ readReady сигнал и положить его в setMedia в первый раз этот ответ есть что почитать. QMediaPlayer вернуть QMediaPlayer::ResourceError ошибка.

PS я добавил QMediaPlayer::StreamPlayback флаг.

------------------------Обновить------------------------- -------------

Я нашел, почему мой код не работает. setMedia вызов функции DirectShowPlayerService::load inertal. И есть проверка строки как это:

else if (stream && (!stream->isReadable() || stream->isSequential())) {
    m_pendingTasks = 0;
    m_graphStatus = InvalidMedia;
    m_error = QMediaPlayer::ResourceError;
}

За isSequential() есть документация:

bool QIODevice:: isSequential () const [virtual] Возвращает true, если это устройство является последовательным; в противном случае возвращает false.

Последовательные устройства, в отличие от устройств с произвольным доступом, не имеют понятия начала, конца, размера или текущей позиции и не поддерживают поиск. Вы можете читать с устройства только тогда, когда оно сообщает, что данные доступны. Наиболее распространенным примером последовательного устройства является сетевой сокет. В Unix специальные файлы, такие как /dev/zero и fifo pipe, являются последовательными.

Обычные файлы, с другой стороны, поддерживают произвольный доступ. У них есть размер и текущая позиция, и они также поддерживают поиск вперед и назад в потоке данных. Обычные файлы не последовательные.

Наконец, сетевой ответ не может быть использован в этом состоянии.:-(

Поэтому моё дальнейшее исследование может быть таким: как доза Qt справится с сетевым сокетом для этого. И есть ли способ получить данные?

------------------Обновить----------------------

Кажется, что QMediaPlayer основывается на GStreamer и есть способ загрузить данные в комментарии исходного кода. Но я не использовал GStreamer, поэтому мне сложно использовать функцию загрузки с Qt.

И единственная полезная информация, которую я нашел, это: QMediaPlayer API для загрузки игрового потока. Но я не знаю, как добиться своего. Пожалуйста, помогите мне!

1 ответ

Если вы хотите загрузить свои медиафайлы и воспроизвести после, вы не можете сделать это следующим образом:

pReply = mgr.get(request);

Используйте сигнал "финиш" QNetworkAccessManager, недействительным QNetworkAccessManager::finished ( QNetworkReply * reply )

Не забывайте, когда вы инициализируете QMediaPlayer, вы должны использовать QMediaPlayer::StreamPlayback

QMediaPlayer* player = new QMediaPlayer(0, QMediaPlayer::StreamPlayback);

И я нашел это, может быть, у вас есть ошибка с вашей версией Qt:

Ссылка на сайт

Другие вопросы по тегам