我可以使用Expo AV的视频组件循环播放视频的最后X秒吗?例如,假设我有一个15秒的视频。我希望它能完全发挥出来,但然后从5秒开始循环。
我想我可以通过把视频分成两个视频,然后只循环第二个视频来达到同样的效果。然而,我尝试了一下,在播放第一个和第二个视频之间出现了延迟。如果你有想法,请告诉我!
为了实现这一点,您将只使用一个视频组件,并通过给视频组件一个回调函数来覆盖默认循环,从而使用playFromPositionAsync
创建一个人工循环。
-
创建将播放的视频的引用
let video : Video | null; //add type if using typescript
-
创建视频组件并提供播放功能。
<Video ref={(r) => {video = r}} //set the video reference source={{uri: uri}} isLooping={false} useNativeControls={false} //to not use native play pause... buttons shouldPlay //if you want your video to play automatically the first time progressUpdateIntervalMillis={100} //the playback update function below will fire every 100ms onPlaybackStatusUpdate={_onPlaybackStatusUpdate} />
-
定义回放功能
const _onPlaybackStatusUpdate = (status: AVPlaybackStatus)=>{ if (status.isLoaded){ //video is loaded without error if (status.didJustFinish){ //fired only once when video ends video?.playFromPositionAsync(10000, { toleranceMillisBefore: 0, toleranceMillisAfter: 0 }); //start at 10sec with 0 tolerance (starts exactly at 10sec) } } }
这里发生的情况是,每当视频结束时,您都会从10秒开始播放视频。注意,didJustFinish
只触发一次,但您应该经常更新以检查播放是否真的结束了,因此progressUpdateIntervalMillis
。如果没有这一点,结束事件在视频的开头将是错误的,循环将不会开始。