如何修复“视频播放但在带有Expo的iOS上没有声音”

时间:2019-08-06 08:05:49

标签: ios react-native video expo react-native-video

我使用博览会的视频组件。我可以播放视频,但是在iOS中无法播放。在Android中可以。我该如何解决。

<Video style={{ width: 340, 
                                height: 220,
                                borderRadius: 10, 
                                overflow: 'hidden' }}
                                posterSource={require('../../assets/loading2.gif')}
                                usePoster={true}
                                rate={1.0}
                                isMuted={false}
                                useNativeControls = {true}
                                volume={1.0}
                                playsInSilentLockedModeIOS ={ true }
                                resizeMode='cover' 
                                shouldPlay={true} 
                                source={{uri : url}} />

3 个答案:

答案 0 :(得分:3)

启用背景音频不是解决方案(尤其是在使用托管的Expo项目时,Xcode设置不理想的情况)。我发现当您使用useNativeControls={true}并且不自动播放视频时,该错误存在。如果您尝试使用shouldPlay={true},则应该会看到它起作用。那不是一个很好的解决方案(自动播放视频的时间大约是MySpace,大约是2005年)。

我通过使用自定义播放按钮在视频屏幕上放置叠加层来解决此问题。由于某些原因,从视频裁判处调用播放会使用正确的声音配置文件。

  const videoRef = React.useRef<Video>()

  React.useEffect(() => {
    const enableAudio = async () => {
        await Audio.setAudioModeAsync({
        allowsRecordingIOS: false,
        interruptionModeIOS: INTERRUPTION_MODE_IOS_DO_NOT_MIX,
        playsInSilentModeIOS: true,
        staysActiveInBackground: false,
        interruptionModeAndroid: INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
        shouldDuckAndroid: false,
      })
    }
    enableAudio()
  }, [])

  const play = () => videoRef.current && videoRef.current.playAsync()

  const poster = (
      <View position="absolute" flexible="column-center" bg="transparent">
        <IconButton
          name="play"
          onPress={play}
          size={72}
          iconSize={72}
          bg="transparent"
          iconColor="rgba(255,255,255,0.9)"
        />
      </View>
    )

  return (
    <View>
      <VideoPlayer
        ref={videoRef}
        source={R.is(String, props.asset) ? { uri: props.asset } : props.asset}
        shouldPlay={props.autoPlay !== false}
        useNativeControls={true}
        rate={1.0}
        volume={1.0}
        resizeMode={Video.RESIZE_MODE_CONTAIN}
      />
      <View position="absolute" flexible="column-center" bg="transparent">
        <IconButton
          name="play"
          onPress={play}
          size={72}
          iconSize={72}
          bg="transparent"
          iconColor="rgba(255,255,255,0.9)"
        />
      </View>
    </View>
  )

答案 1 :(得分:1)

确定在media处于app中时,background是否应继续播放。这样一来,客户就可以继续收听audio

要在iOS上使用此功能,您必须:

答案 2 :(得分:0)

音频无法正常工作,因为我的手机处于静音状态。要更改此默认行为,请设置 playsInSilentLockedModeIOS={ true }

(我知道 OP 已经在他们的代码中包含了这个,但我会回答以防万一这对某人有帮助)。