Управление яркостью факела с помощью AVCaptureDevice.setTorchModeOn ведет себя очень хаотично - PullRequest
3 голосов
/ 10 апреля 2020

В каждой документации, которую я изучал, кажется, что AVCaptureDevice s setTorchModeOn принимает значение от 0.0 до 1.0 и соответственно устанавливает яркость, если такие случаи, как перегрев, не происходят. Но в моих тестах с iPhone 11 setTorchModeOn ведет себя очень хаотично.

Кажется, что каждый последующий вызов setTorchModeOn изменяет яркость в зависимости от последней яркости. Таким образом, если вы позвоните device.setTorchModeOn(0.1) после вызова device.setTorchModeOn(0.2), яркость факела не увеличится, а в основном отключится. И это сохраняется через перезапуски приложения. Факел больше не работает, потому что я думаю, что яркость сейчас слишком мала (возможно, 0,02), чтобы он мог даже работать.

Небольшой пример для гипотезы:

guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else { return }

do {
  try device.lockForConfiguration()
  for i in stride(from: Float(0.5), to: 1.0, by: 0.1) {
    try device.setTorchModeOn(level: i)
    print(device.torchLevel, i)
    sleep(1)
  }
  device.unlockForConfiguration()
} catch { print(error) }

В этом коде яркость не увеличивается, а уменьшается каждую секунду. И когда вы перезапускаете приложение, оно запускается с меньшей яркостью, чем в первый раз (так же, как при последней яркости, оставленной предыдущим запуском), и уменьшается до нуля, а затем факел не работает в приложении. Даже если я переустановлю приложение, оно не будет работать. Факел системы и камера fla sh продолжают работать, хотя. Единственный способ восстановить его - это перезагрузить телефон или щелкнуть фотографию в приложении камеры с включенным флажком sh.

Я очень озадачен этим. Нужно ли сбрасывать состояние устройства или что-то, чтобы это предотвратить? Я пытаюсь изменять яркость фонарика вверх и вниз по заданному шаблону c, но кажется, что go невозможно выполнить резервное копирование. Исключения генерируются, если вы отправляете значение за пределами (0,1) границ. Я попытался смешать его с AVCaptureDevice.maxAvailableTorchLevel, который тоже не работал надежно. Кто-нибудь может подтвердить, что это тоже с ними происходит?

PS: device.torchLevel похоже не отражает аргументы, которые я послал. Вместо этого, похоже, тоже странное поведение. Стандартный вывод приведенного выше кода:

0.0 0.5
0.0 0.6
0.0 0.7
0.0 0.8
0.0 0.9

Это в обоих случаях. В первом запуске, когда яркость уменьшается в 5 раз, а во втором запуске, когда яркость начинается с низкого уровня, и уменьшается один раз, прежде чем отключиться.

Вкл. iOS 13.4, Swift 5.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...