Видео с камеры не работает — React Native

Вопрос

Я пытался выяснить, почему это не работает в течение некоторого времени. Я использовал много примеров кода, однако я все еще не могу понять это.

Код

 takeVideo() {
    console.log('started to take video');
    this.camera.capture({
      audio: true,
      mode: Camera.constants.CaptureMode.video,
      target: Camera.constants.CaptureTarget.disk
    }).then((data) => {
      this.setState({ path: data.path });
      console.log(data);
    }).catch((err) => console.log(err));
  }

  stopVideo() {
    this.camera.stopCapture();
    console.log(this.state.path);
  }

  renderCamera() {
    return (
      <View>
        <Camera
          ref={(cam) => {
            this.camera = cam;
          }}
          style={styles.preview}
          aspect={Camera.constants.Aspect.fill}
          captureTarget={Camera.constants.CaptureTarget.disk}
          captureMode={Camera.constants.CaptureMode.video}
        >
          <TouchableHighlight
            style={styles.capture}
            onPressIn={this.takeVideo.bind(this)}
            onPressOut={this.stopVideo.bind(this)}
            underlayColor="rgba(255, 255, 255, 0.5)"
          >
            <View />
          </TouchableHighlight>
        </Camera>
      </View>
    );
  }

Что не работает

Когда я console.log(this.state.path), он выводит false, что означает, что он не меняется и видео не записывается.

Информация

  • это на айос
  • Это работает, если я изменяю Camera.constants.CaptureMode.video на Camera.constants.CaptureMode.still (.video => .still)
  • Версия РН: react-native-cli: 2.0.1 react-native: 0.44.0

Репо

Я нашел это репо, которое пытается сделать почти то же самое, что и я, и у него такая же проблема. Вот репозиторий: https://github.com/MiLeung/record


person zoecarver    schedule 07.07.2017    source источник
comment
Вы заполнили NSCameraUsageDescription в своем info.plist? Кроме того, какую библиотеку для видео вы используете?   -  person dejakob    schedule 11.07.2017
comment
Да, я добавил это. Есть ли способ, что проблема может быть с эмулятором?   -  person zoecarver    schedule 11.07.2017
comment
Можете ли вы вызвать эти функции: github.com/lwansbrough/ дайте мне знать о результатах, я попробовал это репо сегодня, и все работало нормально в Android. Я хотел бы помочь, если я могу   -  person eden    schedule 12.07.2017
comment
А также попробуйте следующее: captureTarget= {Camera.constants.CaptureTarget.cameraRoll}, где вы определяете камеру в рендеринге.   -  person eden    schedule 12.07.2017
comment
Спасибо за помощь! Как мне запустить функции, которые вы мне прислали? Должен ли я запускать их перед захватом видео? Кроме того, вот ошибка, возникшая после того, как я изменил captureTarget на cameraRoll: imgur.com/a/SgJSS   -  person zoecarver    schedule 12.07.2017
comment
@pudility извините за поздний ответ, вы можете вызывать функции, используя компонент ref to Camera. Верните CaptureTarget обратно к вашей версии и снова вызовите функции. Также имейте в виду, что есть еще несколько параметров захватаTarget   -  person eden    schedule 15.07.2017
comment
Да, я пробовал несколько вещей на нескольких устройствах и эмуляторах (Pixel, эмулятор android nexus 5x, iPhone 7, iPhone 6 plus, эмулятор iPhone SE, эмулятор iPhone 6, эмулятор iPhone 7 и т. д.). Все они работают с неподвижным, но уже видео. Спасибо за помощь, но я думаю, что это может быть просто ошибка.   -  person zoecarver    schedule 15.07.2017
comment
Рад, что ты понял это.   -  person eden    schedule 16.07.2017
comment
@pudility Пожалуйста, попробуйте это: github.com/ColCh/SO-4962215 Это работает для меня. Протестировано на XCode 8, [email protected], iPhone 5C iOS 10.3.2. Он сохраняет видео, а также изображения. Скриншот консоли с записью видео: imgur.com/a/aHtCz. Выдает что-то, если вы пытаетесь запустить этот проект на реальном устройстве?   -  person ColCh    schedule 16.07.2017
comment
Я не уверен, в чем проблема, но когда я запускаю тот же код, что и вы, он все равно не работает. imgur.com/a/tUEuq . Кроме того, в другом моем посте я сделал опечатку, я имел в виду, но не видео. нет, но теперь видео. Еще раз спасибо всем за помощь!   -  person zoecarver    schedule 16.07.2017


Ответы (1)


Все в вашем коде в порядке, однако вы упускаете одну важную вещь.

this.camera.capture({
      audio: true,
      mode: Camera.constants.CaptureMode.video,
      target: Camera.constants.CaptureTarget.disk
}).then((data) => {
      this.setState({ path: data.path });
      console.log(data);
}).catch((err) => console.log(err));

В приведенном выше коде вы указываете состояние, чтобы установить путь к объекту после сохранения данных.

Но есть:

stopVideo() {
    this.camera.stopCapture();
    console.log(this.state.path);
}

Вы получаете объект пути перед сохранением данных.

Просто попробуйте это:

this.camera.capture({
          audio: true,
          mode: Camera.constants.CaptureMode.video,
          target: Camera.constants.CaptureTarget.disk
}).then((data) => {
          this.setState({ path: data.path });
          console.log(this.state.path); // You should have your path set
          console.log(data);
}).catch((err) => console.log(err));

Функция stopCapture указывает нативному коду остановить запись и сохранить видео — это может занять некоторое время, поэтому выполнение this.state.path сразу после stopCapture не работает.

Для получения дополнительной информации посетите страницу https://developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Global_Objects/Promise

person kGielo    schedule 21.08.2017