加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用QMediaPlayer播放自定义流

发布时间:2020-12-16 07:12:36 所属栏目:百科 来源:网络整理
导读:我彻底搜索了我的问题的答案,但到目前为止还没有其他帖子有用. 我正在Qt中开发一个应用程序,我需要播放通过自定义协议接收的视频流.我发现自己试图以各种可能的方式在QMediaPlayer中提供这些数据包而没有成功.我的想法是在QBuffer中写入传入的数据包,然后从Q
我彻底搜索了我的问题的答案,但到目前为止还没有其他帖子有用.
我正在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音频数据

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读