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

Posted

技术标签:

【中文标题】如何修复“视频播放但在带有 expo 的 iOS 上没有声音”【英文标题】:How to fix 'Video play but don't have sound on iOS with expo' 【发布时间】:2019-08-06 08:05:49 【问题描述】:

我使用世博会的视频组件。我可以播放视频,但在 ios 中没有声音。在安卓里没问题。我该如何解决它。

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

【问题讨论】:

【参考方案1】:

启用背景音频不是解决方案(尤其是在您使用托管的 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>
  )

【讨论】:

这太疯狂了。我只是将其设置为自动播放,并且声音正常。哈哈! @zackify 我知道?‍♂️ 我正面临使用 expo-av 播放 ios 视频静音的问题,而 android 播放声音。您能否详细说明在哪里添加“自动播放”以及它是如何工作的? @DolaChakraborty 如果你想让它自动播放(这在 iOS 上解决了这个问题),你可以将这两个属性设置为 true: 【参考方案2】:

音频无法正常工作,因为我将手机设为静音。要更改此默认行为,请设置 playsInSilentLockedModeIOS= true

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

【讨论】:

【参考方案3】:

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

ignoreSilentSwitch='ignore'

【讨论】:

【参考方案4】:

确定media 是否应在app 位于background 中时继续播放。这让客户可以继续收听audio

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

Enable BackgroundXcode 项目中的音频 将 ignoreSilentSwitch 属性设置为 "ignore"

【讨论】:

但是我玩的时候。没声音。 你是用真手机测试吗? 是的,我在 Iphone 8 plus 上使用 iOS 12 进行测试。

以上是关于如何修复“视频播放但在带有 expo 的 iOS 上没有声音”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复drv?

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞