navigator.mediaDevices deviceId在Flutter上不起作用

igsr9ssn  于 2023-03-24  发布在  Flutter
关注(0)|答案(1)|浏览(270)

我正在使用Flutter制作一个视频通话应用程序,我目前正在使用以下代码获取视频流:

Future<MediaStream> _getLocalVideoStream(dynamic navigator) async {
    _loadCamerasInfo();
    return navigator.mediaDevices.getUserMedia({
      "video": {"deviceId":"0"},
      "audio": false
    });
  }

这应该会打开后置摄像头,但前置摄像头却被打开了,我还检查了所有的媒体设备,如下所示:

List<MediaDeviceInfo> deviceInfo =
        await navigator.mediaDevices.enumerateDevices();

迭代deviceInfo中每个项目的deviceId属性将得到以下值:0,1,2,3,这意味着0应该对应于其中一个摄像头,但无论我在_getLocalVideoStream函数中使用此列表中的哪个ID,都会使用相同的默认前置摄像头。
我如何纠正这个问题,以便我可以在设备的不同摄像头之间循环?(我正在一个真实的的Android设备上测试这个问题)

8zzbczxx

8zzbczxx1#

首先,当你使用navigator.mediaDevices.enumerateDevices();时,它会返回所有的mediaDevices,包括麦克风,耳机和摄像头,所以deviceId0可能不是摄像头,而是麦克风。
其次,当你列出你的限制:

{
  "video": {"deviceId":"0"},
  "audio": false
}

这不是设备ID的约束,这意味着它可能会忽略您对设备ID的请求,而只是选择它找到的第一个视频设备。您可以修改约束,如下所示:

{
    "video": {
               "deviceId": {
                  "exact": someId
               }
             }
}

使用确切的关键字将强制它使用该ID。
此外,如果您不想搜索特定的deviceId并使用它。您可以使用一个有用的关键字“facingMode”,这主要适用于移动的设备。它可以用于设置您想要的相机类型的首选项。例如面向用户或面向环境。请看下面的示例:

"video": {
           "facingMode": "user" //prefers front camera if available
//      or "facingMode": "environment"  --> perfers rear camera if available
         }

相关问题