1

我有一个工作流设备(带有摄像头模块的树莓派 - 它有一个名为“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(根据文档,它支持流输入)。我已经有一些代码可以从套接字读取数据并播放本地文件。

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

此外,在从 PI 进行 netcat'ing 并在 Windows 中运行编译后的程序后,我可以看到树莓派上 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();
    }
}
4

0 回答 0