如何使用 VLC-QT 包装器流式传输视频
How to stream the video using VLC-QT wrapper
我想使用 RTSP, HTTP and UDP
流式传输视频,因为 vlc
支持它们。我正在使用 Qt5
,因为 Qt
没有那么好的媒体库,所以我选择开源,现在使用 libvlc
到 VLC-Qt
包装器。
我的程序可以接收流媒体视频,接收流媒体视频的源代码如下
void player::on_actionNETWORK_STREAM_triggered()
{
QString url= QInputDialog::getText(this,tr("Open Url"),tr("Enter the URL you want to play"));
if(url.isEmpty())
return;
else
{
m_media=new VlcMedia(url,m_instance);
playlist.append(url);
m_mediaList->addMedia(m_media);
m_player->open(m_media);
}
}
为了接收流式视频,我只是将该视频的 url 放入新的 VlcMedia
实例中,但不知道如何流式传输视频。
在阅读 VLC-QT
包装器的文档时,我读到它有一个名为 VlcVideoStream
的 class
,但我不知道如何使用 class 来做流媒体。此 class
文档的 link 如下所示
https://vlc-qt.tano.si/reference/1.1/classvlcvideostream
编辑 1
我在互联网上搜索了更多关于这个东西的信息,然后我发现了一些关于如何使用 VlcVideoStream
的讨论,我已经为此实现了代码。下面给出源码
class VideoStreaming : public VlcVideoStream
{
Q_OBJECT
public:
explicit VideoStreaming(QObject *parent = nullptr);
void frameUpdated();
};
void VideoStreaming::frameUpdated()
{
int rows,cols;
std::shared_ptr<const VlcAbstractVideoFrame> frame= renderFrame();
if (!frame)
return; // LCOV_EXCL_LINE
rows = frame->height + frame->height/2;
cols = frame->width;
qDebug()<<"Frame updated gets called";
}
并用下面的行实例化它
m_video_stream= new VideoStreaming(ui->m_video);
m_video_stream->init(m_player);
现在我可以接收视频的 YUV
帧,但直到现在我还不知道如何流式传输视频。任何帮助表示赞赏。即使我对纯 libvlc
流媒体解决方案持开放态度,因为 VLC-QT
包装器并不是支持视频流的好包装器。
我只是使用 VlcMedia
的 setOption()
功能来设置流媒体属性并且它有效。
m_media = new VlcMedia("file:///home/vinay/Media Library/lion-sample.webm",m_instance);
m_media->setOption(":sout=#transcode{vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:udp{dst=127.0.0.1:1234}");
m_media->setOption(":no-sout-all");
m_media->setOption(":sout-keep");
这些字符串参数取自 vlc
应用程序。当我们通过 vlc
应用程序流式传输视频时,在最后 window 它会显示您设置的所有这些参数。所以我只是复制这些参数并将其作为参数传递给 setOption()
并且它起作用了。
你可以在这个 link
中阅读我对这个话题的详细讨论
https://forum.qt.io/topic/121483/how-to-stream-the-video-using-vlc-qt-wrapper-or-libvlc/10
我想使用 RTSP, HTTP and UDP
流式传输视频,因为 vlc
支持它们。我正在使用 Qt5
,因为 Qt
没有那么好的媒体库,所以我选择开源,现在使用 libvlc
到 VLC-Qt
包装器。
我的程序可以接收流媒体视频,接收流媒体视频的源代码如下
void player::on_actionNETWORK_STREAM_triggered()
{
QString url= QInputDialog::getText(this,tr("Open Url"),tr("Enter the URL you want to play"));
if(url.isEmpty())
return;
else
{
m_media=new VlcMedia(url,m_instance);
playlist.append(url);
m_mediaList->addMedia(m_media);
m_player->open(m_media);
}
}
为了接收流式视频,我只是将该视频的 url 放入新的 VlcMedia
实例中,但不知道如何流式传输视频。
在阅读 VLC-QT
包装器的文档时,我读到它有一个名为 VlcVideoStream
的 class
,但我不知道如何使用 class 来做流媒体。此 class
文档的 link 如下所示
https://vlc-qt.tano.si/reference/1.1/classvlcvideostream
编辑 1
我在互联网上搜索了更多关于这个东西的信息,然后我发现了一些关于如何使用 VlcVideoStream
的讨论,我已经为此实现了代码。下面给出源码
class VideoStreaming : public VlcVideoStream
{
Q_OBJECT
public:
explicit VideoStreaming(QObject *parent = nullptr);
void frameUpdated();
};
void VideoStreaming::frameUpdated()
{
int rows,cols;
std::shared_ptr<const VlcAbstractVideoFrame> frame= renderFrame();
if (!frame)
return; // LCOV_EXCL_LINE
rows = frame->height + frame->height/2;
cols = frame->width;
qDebug()<<"Frame updated gets called";
}
并用下面的行实例化它
m_video_stream= new VideoStreaming(ui->m_video);
m_video_stream->init(m_player);
现在我可以接收视频的 YUV
帧,但直到现在我还不知道如何流式传输视频。任何帮助表示赞赏。即使我对纯 libvlc
流媒体解决方案持开放态度,因为 VLC-QT
包装器并不是支持视频流的好包装器。
我只是使用 VlcMedia
的 setOption()
功能来设置流媒体属性并且它有效。
m_media = new VlcMedia("file:///home/vinay/Media Library/lion-sample.webm",m_instance);
m_media->setOption(":sout=#transcode{vcodec=h264,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:udp{dst=127.0.0.1:1234}");
m_media->setOption(":no-sout-all");
m_media->setOption(":sout-keep");
这些字符串参数取自 vlc
应用程序。当我们通过 vlc
应用程序流式传输视频时,在最后 window 它会显示您设置的所有这些参数。所以我只是复制这些参数并将其作为参数传递给 setOption()
并且它起作用了。
你可以在这个 link
中阅读我对这个话题的详细讨论https://forum.qt.io/topic/121483/how-to-stream-the-video-using-vlc-qt-wrapper-or-libvlc/10