2015-06-14 62 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到播放解碼PCM音頻數據