1

反应原生平台:

  • iOS
  • 安卓

问题:

我正在尝试捕获屏幕。当视频暂停时。但是每当我尝试从视频中捕获图像时。它的投掷警告并且无法捕捉到它;

可能的未处理承诺拒绝(id:25):错误:内容大小不得为零或负数。得到: (0, 410)

库版本:

"react-native-video": "^5.1.0-alpha8",
"react-native-view-shot": "^3.1.2",

代码:

 const viewShotRef = useRef(null);
 const [uri, setUri] = useState('');

<ViewShot
      style={[styles.imageViewerStyleVideo, {height: 410}]}
      ref={viewShotRef}
      captureMode="continuous"
      options={{format: 'jpg', quality: 0.9}}>
         <Video
             ref={(p) => {
               videoRef = p;
         }}
         paused={isPaused}
         source={getImageSource(caseViewerVideo)}
         resizeMode={'contain'}
         selectedVideoTrack={'auto'}
         style={styles.fullScreenMode}
         controls={true}
         playInBackground={false}
         playWhenInactive={false}
      />
</ViewShot>

<Pressable
        style={{
          width: 40,
          height: 40,
          borderWidth: 1,
          borderRadius: 20,
          position: 'absolute',
          top: 260,
          right: 80,
          borderColor: Colors.pencil,
          backgroundColor: Colors.shadow,
        }}
        onPress={() => onCapture()}
 />

const onCapture = async () => {
    const uri = await viewShotRef.current.capture();
    setUri(uri);
    console.log(uri);
 };
4

1 回答 1

0

根据github页面

“连续”是实验性的,这将连续捕获很多图像。对于非常具体的用例。

从您的代码中,我看到您需要Pressable制作屏幕截图。我建议你完全删除captureMode道具。

在常见问题解答上我读到:

得到“内容大小不能为零或负数。”

确保不要立即快照,至少需要等待第一个 onLayout 事件或超时后,否则 View 可能还没有准备好。(如果有的话,等待 Image onLoad 也应该是安全的)。如果您仍然有问题,请确保您的视图实际上具有 > 0 的宽度和高度。

或者,您可以使用等待第一个 onLayout 的 ViewShot 组件。

因此,也许您应该在进行屏幕截图之前等待Video'sonLoad事件(另一个建议您删除captureMode道具的原因)。

或者,您可以使用captureRef(view, options)orcaptureScreen()代替capture().

于 2021-06-15T07:08:13.827 回答