【发布时间】:2015-08-29 23:15:00
【问题描述】:
我彻底搜索以找到问题的答案,但到目前为止没有其他帖子有帮助。 我正在 Qt 中开发一个应用程序,我需要播放通过自定义协议接收的视频流。我发现自己试图以各种可能的方式在 QMediaPlayer 中提供这些数据包,但没有成功。我的想法是在 QBuffer 中写入传入的数据包,然后从 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 信号是否已发出并且确实如此)?除了再次调用 setMedia 之外,我发现没有办法让 QMediaPlayer 播放新的传入数据。有没有办法通知 QMediaPlayer 媒体长度发生了变化?
有没有更简单的方法来做到这一点?我是否想过编写自己的 QIODevice 或以某种方式将我的数据包接收器集成到 Qt 框架中,以将我的自定义流作为 QMediaContent 提供?
是否有任何其他库或方法可以让我完成这项任务?
我使用的是 Qt 5.4。 提前感谢您的帮助。
【问题讨论】:
-
您能否提供有关正在播放的媒体类型的更多信息(容器/原始 RTP 或 UDP/...)。我的猜测是,由于各种格式都有数据包边界,也许您正在跳过一些告诉媒体播放器新数据可用的数据?无论如何,继承 QIODevice 听起来是个好方法。