我有一个工作流设备(带有摄像头模块的树莓派 - 它有一个名为“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();
}
}