在Qt中播放H264视频流(来自raspberry pi)

时间:2013-05-30 13:19:40

标签: c++ qt sockets video-streaming media-player

我有一个有效的流媒体设备(带有相机模块的树莓派 - 它有一个名为“raspivid”的工具),我使用netcat从中直播视频

raspivid -t 999999 -w 300 -h 300 -hf -fps 20 -o - | nc -l 9999

在Ubuntu中,使用netcat连接到设备并将视频流式传输到mplayer后,一切都像魅力一样......

nc *ip* 9999 | mplayer -fps 200 -demuxer h264es -

现在,我想让这个视频适用于Windows用户(需要最少的设置,可能只有.exe)。 我决定使用Qt 5 - 它有qTcpSocket和QMediaPlayer(根据doc,它支持流输入)。 我已经有一些代码可以从套接字读取数据并播放本地文件。

但播放流似乎不起作用。也许是因为视频格式和一些编解码器? WMP也无法播放我使用raspivid保存的视频,尽管vlc可以完美播放。 我还在raspberry pi中测试了一个简单的.avi文件(Qt在本地光盘中成功播放)并在Qt中播放相同的TcpStream但没有成功。

此外,在从网上进行netcat并在Windows中运行已编译的程序之后,我可以看到覆盆子pi上的wifi加密狗上的LED开始闪烁 - 因此流到达应用程序。

你能不能给我一些建议,下一步做什么/尝试?

我以前没有太多使用C ++的经验,所以如果我问的是什么问题,请不要太过刻意地打击我:)

此外,“SimpleChatClient”来自我开始研究的随机模板..

SimpleChatClient::SimpleChatClient(QWidget* parent, Qt::WindowFlags flags)
: QWidget(parent, flags)
{
    QVBoxLayout* main   = new QVBoxLayout(this);
    player = new QMediaPlayer(this, QMediaPlayer::StreamPlayback);
    QVideoWidget* widget = new QVideoWidget;
    widget->show();
    player->setVideoOutput(widget);
    main->addWidget(widget);
    setLayout(main);
    socket = new QTcpSocket(this);
    connect(socket, SIGNAL(connected()), this, SLOT(playStream()));
    toggleConnection();
}

SimpleChatClient::~SimpleChatClient()
{
}

void SimpleChatClient::toggleConnection()
{
    if (socket->state() == QAbstractSocket::UnconnectedState)
    {
        socket->connectToHost(SERVER, PORT);
    }
    else
    {
        socket->disconnectFromHost();
    }
}

void SimpleChatClient::playStream()
{
    player->setMedia(QMediaContent(), socket);
    //player->setMedia(QUrl::fromLocalFile("C:\\Users\\m\\d.avi")); //This works for local files
    if (socket->canReadLine())
    {
        player->play();
    }
}

0 个答案:

没有答案