c – 使用QMediaPlayer播放自定义流
|
我彻底搜索了我的问题的答案,但到目前为止还没有其他帖子有用.
我正在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. 解决方法
我的答案不是真正的答案,只是分享我的经验和研究成果.这专注于流的音频部分.
我目前正在处理同样的问题.我有自定义协议,其中包含一个传入[来自网络]数据帧中的一个编码图像和一个编码音频部分.我需要分别处理图像和音频: >解码图像并将原始RGB数据发送到另一个显示它的进程(lol nevermind) 主要:我只能使用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音频数据 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
