0

我需要将网络摄像头流式传输到 IP 地址。经过几天的谷歌搜索,我决定最简单的方法是嵌入 Vlc。也就是说,我仍然对其他解决方案持开放态度。


第 1 步 - 好的!:我可以使用该代码以表格形式查看我的网络摄像头:

vlcPlayer.MediaPlayer.VlcLibDirectory = new DirectoryInfo(@"c:\Program Files (x86)\VideoLAN\VLC\");
vlcPlayer.MediaPlayer.EndInit();
vlcPlayer.MediaPlayer.Play(new Uri(@"dshow://");

第 2 步 - 好的!:现在尝试向前迈出一步,使用本教程,我可以使用 2 个 Vlc 实例在本地 127.0.0.1:5004 发送视频:一个用于传输,一个用于接收。


第 3 步 - 不行:配置 vlc 以将源从文件更改为网络摄像头并通过 ip 传输似乎很简单。所以我所做的就是像以前一样操作,只更改源: 1. 菜单“媒体”--> 流。这将打开“打开媒体”窗口。

在这里,我单击选项卡捕获设备->视频设备名称->我选择“集成网络摄像头”

然后其余的都和以前一样。但什么也没有发生。接收器是黑色的,里面什么都没有。此外,如果我尝试保存来自接收器的流,我只会得到几个字节。发射器的上述设置如下:

捕获设备选项卡 --> 集成网络摄像头。然后流按钮 --> 窗口正确打开 dshow:\ --> 下一个 --> 新目标 RTP,MPEG 传输流 ---> 添加按钮 --> 地址 = 127.0.0.1 端口 = 5004 StreamNAme=test

所以奇怪的是,当我从发射器流式传输具有任何名称的文件时,它会立即被接收器识别。相反,我可能会尝试,当网络摄像头是源时没有任何反应。


话虽如此,上述问题对解决方案并不重要。我关心的不是如何单独使用 vlc,而是如何从我的 wpf 应用程序中使用它来发送网络摄像头流。

谢谢你的帮助

帕特里克

4

1 回答 1

0

我相信这个示例应该可以帮助您实现目标:

static void Main()
{
    var currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
    // Default installation path of VideoLAN.LibVLC.Windows
    var libDirectory =
        new DirectoryInfo(Path.Combine(currentDirectory, "libvlc", IntPtr.Size == 4 ? "win-x86" : "win-x64"));

    using (var mediaPlayer = new Vlc.DotNet.Core.VlcMediaPlayer(libDirectory))
    {

        var mediaOptions = new[]
        {
            ":sout=#rtp{sdp=rtsp://127.0.0.1:554/}",
            ":sout-keep"
        };

        mediaPlayer.SetMedia(new Uri("http://hls1.addictradio.net/addictrock_aac_hls/playlist.m3u8"),
            mediaOptions);

        mediaPlayer.Play();

        Console.WriteLine("Streaming on rtsp://127.0.0.1:554/");
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}

您将需要 2 个 nuget 包:Vlc.DotNet(C# 包装器)和 VideoLAN.LibVLC.Windows(用于 Windows 的 LibVLC 库)。

于 2018-10-13T03:30:36.407 回答