Я тщательно искал, чтобы найти ответ на мою проблему, но никакое другое сообщение не было полезным до сих пор. Я разрабатываю приложение в Qt, где мне нужно воспроизвести видеопоток, который получен через пользовательский протокол. Я обнаружил, что стараюсь всячески кормить эти пакеты в QMediaPlayer без успеха. Моя идея заключалась в том, чтобы писать входящие пакеты в QBuffer, а затем читать их из QMediaPlayer. Следит мое испытание:Воспроизведение пользовательского потока с QMediaPlayer
/// VideoPlayer.h
class VideoPlayer : public QWidget
{
public slots:
void play();
void handlePacket(QByteArray);
[...]
private:
QMediaPlayer mediaPlayer;
QBuffer buffer;
};
/// VideoPlayer.cpp
VideoPlayer::VideoPlayer(QWidget *parent)
: QWidget(parent)
, mediaPlayer(0, (QMediaPlayer::StreamPlayback))
{
buffer.open(QBuffer::ReadWrite);
}
void VideoPlayer::handlePacket(QByteArray packet)
{
buffer.buffer().append(packet);
}
void VideoPlayer::play()
{
mediaPlayer.setMedia(QMediaContent(), &buffer);
mediaPlayer.play();
}
С выше QMediaPlayer воспроизводит данные в буфере в момент вызова mediaPlayer.setMedia(QMediaContent(), &buffer)
, но, кажется, игнорирует, что новые пакеты были приложены к буферу. Может быть, потому, что я напрямую обращаюсь к внутреннему QByteArray (я проверил, что сигнал QIODevice :: readyRead испускается, и это так)? Я не нашел способа заставить QMediaPlayer воспроизводить новые входящие данные, кроме вызова setMedia. Есть ли способ сообщить QMediaPlayer, что длина носителя изменилась?
Есть ли более простой способ сделать это? Я думал о написании собственного QIODevice или каким-то образом интегрировал свой приемник пакетов в платформу Qt, чтобы предоставить свой пользовательский поток в качестве QMediaContent?
Есть ли другие библиотеки или методы, которые позволили бы мне выполнить эту задачу?
Я использую Qt 5.4. Заранее благодарим за помощь.
Возможный дубликат [Как играть в поток с QMediaPlayer] (http://stackoverflow.com/questions/30507317/how-do-i-play-a-stream-with-qmediaplayer) –
Можете ли вы предоставить больше информация о том, какой тип носителя воспроизводится (контейнер/исходный RTP или UDP/...). Я предполагаю, что, поскольку различные форматы имеют границы пакетов, возможно, вы пропускаете некоторые данные, которые сообщают новым медиа-плеерам новые данные? В любом случае подклассификация QIODevice звучит как хороший подход. –