我使用博览会的视频组件。我可以播放视频,但在 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}} />
音频无法正常工作,因为我将手机设为静音。要更改此默认行为,请设置
playsInSilentLockedModeIOS={ true }
。
(我知道OP已经在他们的代码中包含了这个,但我回答只是为了以防万一这对某人有帮助)。
启用背景音频不是解决方案(特别是如果您使用的是托管 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>
)
这对我有用:
ref
组件的引用 (<Video />
)。await Audio.setAudioModeAsync({ playsInSilentModeIOS: true });
。ref.current.playAsync();
总而言之,我的组件如下所示:
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 进行测试。
希望有帮助!
我遇到这个问题是因为启用了 iPhone 侧面的静音开关。为了让视频播放器播放声音,我需要将以下内容作为视频组件的道具。
ignoreSilentSwitch={'ignore'}
最新方法之一,语法稍有变化
await Audio.setAudioModeAsync({
allowsRecordingIOS: false,
interruptionModeIOS: InterruptionModeIOS.DuckOthers,
playsInSilentModeIOS: true,
shouldDuckAndroid: true,
interruptionModeAndroid: InterruptionModeAndroid.DuckOthers,
playThroughEarpieceAndroid: false,
})
检查您的手机是否处于静音状态! 我花了一个小时试图找出问题所在,结果就是......
确定当
media
位于 app
中时,background
是否应继续播放。这使客户可以继续收听audio
。
要在
iOS
上使用此功能,您必须:
Xcode
项目中的音频"ignore"