如何解决“在 iOS 上使用 expo 播放视频但没有声音”的问题

问题描述 投票:0回答:7

我使用博览会的视频组件。我可以播放视频,但在 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}} />
ios react-native video expo react-native-video
7个回答
8
投票

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

playsInSilentLockedModeIOS={ true }

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


6
投票

启用背景音频不是解决方案(特别是如果您使用的是托管 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>
  )


6
投票

这对我有用:

  1. 创建对
    ref
    组件的引用 (
    <Video />
    )。
  2. 在视频开始播放时使用状态进行监听。
  3. 发生时,请致电
    await Audio.setAudioModeAsync({ playsInSilentModeIOS: true });
  4. 之后,立即拨打
    ref.current.playAsync();
  5. 重新播放视频

总而言之,我的组件如下所示:

import React, { useState, useEffect, useRef } from 'react';
import { Audio, Video as OriginalVideo } from 'expo-av';

const triggerAudio = async (ref) => {
  await Audio.setAudioModeAsync({ playsInSilentModeIOS: true });
  ref.current.playAsync();
};

const Video = ({ ...props }) => {
  const ref = useRef(null);
  const [status, setStatus] = useState({});

  useEffect(() => {
    if (status.isPlaying) triggerAudio(ref);
  }, [ref, status.isPlaying]);

  return (
    <OriginalVideo
      ref={ref}
      onPlaybackStatusUpdate={(status) => setStatus(status)}
      useNativeControls
      {...props}
    />
  );
};

使用 Expo SDK v45 和 iOS 16 进行测试。

希望有帮助!


0
投票

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

ignoreSilentSwitch={'ignore'}

0
投票

最新方法之一,语法稍有变化

await Audio.setAudioModeAsync({
     allowsRecordingIOS: false,
     interruptionModeIOS: InterruptionModeIOS.DuckOthers,
     playsInSilentModeIOS: true,
     shouldDuckAndroid: true,
     interruptionModeAndroid: InterruptionModeAndroid.DuckOthers,
     playThroughEarpieceAndroid: false,
})

0
投票

检查您的手机是否处于静音状态! 我花了一个小时试图找出问题所在,结果就是......


-1
投票

确定当

media
位于
app
中时,
background
是否应继续播放。这使客户可以继续收听
audio

要在

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

  • 启用背景
    Xcode
    项目中的音频
  • 将ignoreSilentSwitch属性设置为
    "ignore"
© www.soinside.com 2019 - 2024. All rights reserved.