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

How to fix 'Video play but don't have sound on iOS with expo'

我使用 expo 的视频组件。我可以播放视频,但在 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}} />

确定 media 是否应在 appbackground 中时继续播放。这允许客户继续收听 audio.

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

  • Enable Background 您的 Xcode 项目中的音频
  • 将 ignoreSilentSwitch 属性设置为 "ignore"

启用背景音频不是解决方案(特别是如果您使用的是托管的 Expo 项目,其中乱用 Xcode 设置并不理想)。我发现当您使用 useNativeControls={true} 并且不自动播放视频时存在该错误。如果您尝试 shouldPlay={true},您应该会看到它正常工作。这不是一个很好的解决方案(自动播放视频在 2005 年左右非常适合 MySpace)。

我通过使用自定义播放按钮在视频屏幕上叠加来修复它。出于某种原因,从视频参考调用播放使用正确的声音配置文件。

  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>
  )

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

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

由于启用了 iPhone 一侧的静音开关,我遇到了这个问题。为了让视频播放器播放声音,我需要将以下内容作为视频组件的道具。

ignoreSilentSwitch={'ignore'}