如何修复“视频播放但在 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
是否应在 app
在 background
中时继续播放。这允许客户继续收听 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'}
我使用 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
是否应在 app
在 background
中时继续播放。这允许客户继续收听 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'}