在VLC-Unity中,为什么媒体播放器无法使用DirectShow播放USB摄像头的视频源?

问题描述 投票:0回答:1

(300点的赏金是永久性的:如果是由库错误引起的,赏金将在相应的修补程序发布时追溯授予)

我正在试验 VLC-Unit 对于各种视频流协议的功能,其中最简单的应该是直接播放 USB 摄像头的视频源。

为此,我从一个简单的示例实现开始(在 Windows 下编译和执行):

https://github.com/videolan/vlc-unity/blob/master/Assets/VLCUnity/Demos/Scripts/VLCMinimalPlayback.cs

此演示是为了使用 http 协议在 GoogleDrive 上播放视频而编写的:

            if(_mediaPlayer.Media == null)
            {
                // playing remote media
                _mediaPlayer.Media = new Media(new Uri("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"));
            }

我进行了以下更改,将其重新用于 USB 摄像头:

            if (_mediaPlayer.Media == null)
            {
                // playing remote media

                // _mediaPlayer.Media = new Media(new Uri("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"));

                _mediaPlayer.Media =
                    new Media(
                        new Uri("dshow://")
                    );
                _mediaPlayer.Media.AddOption(":dshow-vdev=<My USB Camera Name>);

                Task.Run(async () =>
                    {
                        var success = await _mediaPlayer.PlayAsync();

                        uint height = 0;
                        uint width = 0;
                        _mediaPlayer.Size(0, ref width, ref height);

                        Debug.Log("Media size: " + width + "x" + height);
                    }
                );
            }

不幸的是,当示例执行时,我得到了以下调试信息:

Media size: 0x0

显然,在这种情况下无法显示视频(音频馈送似乎正常)。即使

<My USB Camera Name>
是单引号或双引号,也可以观察到这种现象。是什么导致 VLC-Unity 在如此简单的情况下失败?怎么解决?

更新 1:从 VLC 播放器中打开时,相机功能齐全,日志片段(调试级别的详细信息)显示在此处:


main debug: Creating an input for 'dshow://'
main debug: requesting art for new input thread
main debug: using timeshift granularity of 50 MiB
main debug: using timeshift path: C:\Users\pengc\AppData\Local\Temp
main debug: `dshow://' gives access `dshow' demux `any' path `'
main debug: creating demux: access='dshow' demux='any' location='' file='(null)'
main debug: looking for access_demux module matching "dshow": 15 candidates
main debug: looking for meta fetcher module matching "any": 1 candidates
dshow debug: dshow-vdev: <Camera Name>
dshow debug: dshow-adev: none

更新1:我想这不是一个非常具体的例子。所以我在 Github 上上传了 2 个简约的实验。以下两个实验均在 Windows 11 上进行,同时安装了 VLC 播放器和 OBS Studio(因此 OBS 虚拟相机始终是默认捕获设备)

实验一:OBS虚拟相机

https://github.com/tribbloid/VLCUnitySpike/blob/main/Assets/Scripts/VLCMinimalPlaybackOBS.cs

媒体播放器的创建者:

                _mediaPlayer.Media = new Media(
                    new Uri(
                        "dshow://"
                    )
                );
                
                _mediaPlayer.Media.AddOption(":dshow-vdev=\"OBS Virtual Camera\"");
                _mediaPlayer.Media.AddOption(":dshow-adev=None");

事实证明,Unity 应用程序只能播放第一帧,尽管不断更新缓冲区,但显示的视频立即冻结。无论如何,它已经找到了正确的相机。

实验2:网络摄像头

https://github.com/tribbloid/VLLCUnitySpike/blob/main/Assets/Scripts/VLCMinimalPlaybackWebcam.cs

与第一个示例类似,但以下几行除外:


                _mediaPlayer.Media = new Media(
                    new Uri(
                        "dshow://"
                    )
                );
                
                _mediaPlayer.Media.AddOption(":dshow-vdev=\"USB2.0 HD UVC WebCam\"");
                _mediaPlayer.Media.AddOption(":dshow-adev=None");

结果与实验1相同,使用相同的默认OBS相机,并且仅显示第一帧。我还没有测试何时删除所有参数,但结果应该是相同的。

此存储库可以通过任何 Unity Editor 2022 LTS 打开,但必须手动导入 VLUnity 资源。我导入了专有版本,但试用版应该同样有效。

目前这个问题的原因还不清楚。如果您可以先复制它,请告诉我。

更新2:我可以上传资产的试用版(应该有开源许可证)以便轻松重现我的问题,如果您需要这个,请告诉我。

unity-game-engine directshow libvlcsharp vlc-unity
1个回答
0
投票
  1. 线程安全: 当您使用 Task.Run() 时,您在不同的线程上运行代码,这可能会导致 Unity 中出现意外行为。特别是考虑到您在此任务中访问 _mediaPlayer.Size() 。这可能是一个问题。

  2. 检查介质错误: 创建媒体时可能出错。设置媒体后,检查是否有错误:

    if (_mediaPlayer.Media != null) { Debug.LogError(_mediaPlayer.Media.ErrorMessage()); }

  3. 相机访问: 我知道这很愚蠢,但有时这是小事...... 如果相机正在被其他应用程序(例如默认相机应用程序)使用,则 VLC 可能无法使用该相机。确保没有其他应用程序正在使用相机。

  4. 延迟尺寸获取: 开始播放后,视频尺寸可能不会立即可用。您可以延迟此操作,而不是在开始播放后立即尝试获取宽度和高度:

    等待任务.延迟(1000); //等待1秒 _mediaPlayer.Size(0, 参考宽度, 参考高度);

© www.soinside.com 2019 - 2024. All rights reserved.