2015-06-14 3 views
4

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

+0

Возможный дубликат [Как играть в поток с QMediaPlayer] (http://stackoverflow.com/questions/30507317/how-do-i-play-a-stream-with-qmediaplayer) –

+0

Можете ли вы предоставить больше информация о том, какой тип носителя воспроизводится (контейнер/исходный RTP или UDP/...). Я предполагаю, что, поскольку различные форматы имеют границы пакетов, возможно, вы пропускаете некоторые данные, которые сообщают новым медиа-плеерам новые данные? В любом случае подклассификация QIODevice звучит как хороший подход. –

ответ

0

Думаю, что this такой же вопрос. Прочтите. Но другой пользователь также не находит решение в Qt, ему также необходимо использовать библиотеку VLC.

1

Мой ответ - не реальный ответ, просто обмен опытом и результатами исследований. Это было сосредоточено на звуковой части потока.

В настоящее время я работаю с той же проблемой. У меня есть собственный протокол, который содержит одно кодированное изображение и одну кодированную часть аудио в пределах одного входящего [из сети] кадра данных. Мне нужно обрабатывать изображение и звук отдельно:

  • декодирования изображения и отправить исходные данные RGB в другой процесс, который будет отображать его (лол фигу) аудио часть
  • играть любым способом

Главная: Я могу использовать только библиотеку Qt. Это потому, что libVLC [который я использую прямо сейчас для этих вещей], буферизующий аудио/видео, и я не нашел способа отключить его и воспроизвести поток в режиме реального времени. Я должен отметить, что входящий поток от видеокамеры, поэтому мне нужно играть в нее как можно в реальном времени.

Во время моего быстрого исследования, я нашел способ пьес что-то:

// init method 
{ 
    // ... 
    mPlayer = new QMediaPlayer(this, QMediaPlayer::StreamPlayback); 
    mBuffer = new QBuffer(this); 
    mBuffer->open(QIODevice::ReadWrite); 
    // ... 
} 

// trying to play audio portion 
void MyCoolPlayer::handleFrameAudio(const QByteArray &audioBlob) 
{ 
    mBuffer->seek(0); 
    mBuffer->write(audioBlob); 
    mBuffer->seek(0); 
    mPlayer->setMedia(QMediaContent(), mBuffer); 
    mPlayer->play(); 
} 

Это играет какой-то искаженный звук, но по крайней мере он играет что-то.

Кроме того, если у вас есть аудио/видео декодер, вы можете использовать:

  • QPainter :: DrawImage рисовать декодированные данные изображения RGB на пустой виджет
  • QAudioOutput к играм декодируют аудиоданные с ИКМ
Смежные вопросы