Получить потоковые данные из 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: