我徹底搜索以找到我的問題的答案,但目前爲止沒有其他文章有幫助。 我正在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聽起來像是一個好方法。 –