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音频数据 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |