网络摄像头检测是否仍然支持 vlcj-4.7.3

Is webcam detection still supported vlcj-4.7.3

是否仍然支持网络摄像头检测? MediaDiscovererTest.java 文件似乎没有检测到任何捕获设备。 (win/mac) 在我看来,设备检测在 MAC webcam-capture driver for vlcj

上与早期版本的 vlcj 一起使用
...
MediaPlayerFactory mediaPlayerFactory = createMediaPlayerFactory();
MediaDiscoverer videoMediaDiscoverer = mediaPlayerFactory.newVideoMediaDiscoverer();
MediaList videoDeviceList = videoMediaDiscoverer.getMediaList();
List<MediaListItem> videoDevices = videoDeviceList.items();
...

VLC 能够检测到捕获设备。

在此先感谢您的帮助。

#edit1

在vlcj-4.7.3中使用下面的代码似乎没有return网络摄像头。但也许我错过了什么。

MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
List<MediaDiscovererDescription> videoDevices = mediaPlayerFactory.mediaDiscoverers().discoverers(MediaDiscovererCategory.DEVICES);

#edit 2

当我运行以下代码时;

List<MediaDiscovererDescription> discoverers = factory.mediaDiscoverers().discoverers(MediaDiscovererCategory.DEVICES);

在 Windows 10 下,我得到以下列表:(无视频捕获)

[MediaDiscovererDescription[name=disc,longName=Discs,category=DEVICES],
 MediaDiscovererDescription[name=disc,longName=Discs,category=DEVICES]

在 MacOs 12.4 上我得到一个空列表...

#edit 3

捕获设备检测仅在linux

下有效

使用 vlcj-4.7.x,发现视频捕获设备的 API 如下所示:

List<MediaDiscovererDescription> discoverers = factory.mediaDiscoverers().discoverers(MediaDiscovererCategory.DEVICES);

当我 运行 那个代码时,我看到这样的东西:

[DEVICES     ] v4l                  "Video capture"
[DEVICES     ] disc                 "Discs"
[DEVICES     ] xcb_apps             "Screen capture"
[DEVICES     ] mtp                  "MTP devices"
[DEVICES     ] pulse                "Audio capture"

在这种情况下,在 Linux,发现者 ID 是“v4l”。

现在您在发现者描述列表中找到了“v4l”发现者。一旦你有了那个发现者实例,你就可以调用它的方法来获取实际的捕获设备。

如果您事先知道发现者 ID(在所有(?)情况下您都会知道),您可以改为这样做:

MediaDiscoverer discoverer = factory.mediaDiscoverers().discoverer("v4l");

然后您从该发现者处获取媒体列表并将侦听器添加到该媒体列表。

最后你必须启动()发现者。

当捕获设备为added/removed(或'detected')时将触发侦听器。

MediaList list = discoverer.newMediaList();

list.events().addMediaListEventListener(new MediaListEventAdapter() {
    @Override
    public void mediaListItemAdded(MediaList mediaList, MediaRef item, int index) {
        System.out.println(name + ": added " + item);
    }

    @Override
    public void mediaListItemDeleted(MediaList mediaList, MediaRef item, int index) {
        System.out.println(name + ": deleted " + item);
    }
});

discoverer.start();

vlcj MediaDiscovererTest class 展示了所有这些。

MediaRef 实例是捕获设备的 MRL,然后您可以使用它来构建菜单 select 以播放其中之一或其他内容。