【问题标题】:Audio expo library not pausing audio files音频展览库不暂停音频文件
【发布时间】:2021-04-25 01:16:02
【问题描述】:

试图通过从事一个项目来学习 React Native,但遇到了阻碍。

目标:尝试创建一种自动播放功能,在按下按钮时音频文件一个接一个地连续播放,并且在再次按下该按钮时也可以暂停。

当前进度:我可以让音频一个接一个地连续播放,没有任何问题。如果你看下面的截图,音频文件是在“useEffect”中加载的,当按下按钮时,它会调用“handlePlayPause”函数,音频会持续播放。

const [autoPlayIndex, setAutoPlayIndex] = useState(0);
const [playBackInstance, setPlayBackInstance] = useState(null);
const [clickNum, setClickNum] = useState(0);

const loadAudio = async () => {
  if(autoPlayIndex < data.length) {
    if(data[autoPlayIndex].id == 101) {
      const { sound } = await Audio.Sound.createAsync(require("../assets/zoning.mp3"), {progressUpdateIntervalMillis: 100});
      sound.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);
      setPlayBackInstance(sound);
    } else if (data[autoPlayIndex].id == 103) {
      const { sound } = await Audio.Sound.createAsync(require("../assets/draymond_green.mp3"), {progressUpdateIntervalMillis: 100});
      sound.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);
      setPlayBackInstance(sound);
    } else {
      const { sound } = await Audio.Sound.createAsync({uri: data[autoPlayIndex].file}, {progressUpdateIntervalMillis: 100});
      sound.setOnPlaybackStatusUpdate(onPlaybackStatusUpdate);
      setPlayBackInstance(sound);
    }
    if(clickNum % 2 != 0) {
      await playBackInstance.playAsync();
    }
  }

}

const handlePlayPause = () => {
  if(clickNum % 2 == 0) {
    playBackInstance.playAsync();
  } else {
    playBackInstance.pauseAsync()
  }

  setClickNum(clickNum => clickNum + 1);
}

const handleNext = async () => {
  setAutoPlayIndex(autoPlayIndex => autoPlayIndex + 1);
}

const onPlaybackStatusUpdate = async (status) => {
  if(status.isPlaying) {
    const duration = status.positionMillis;
    const length = status.durationMillis;
    const diff = length - duration;
    setTimeRemaining(Moment.utc(diff).format("m:ss"));
  }
  if(status.didJustFinish) {
    handleNext();
  }
}

useEffect(() => {
  if(data.length != 0 ) {
    loadAudio();
  }
}, [autoPlayIndex, clickNum]);

问题:音频文件不会立即暂停,而是在播放完当前音频剪辑后暂停。不知道究竟是为什么,因为我指定了“pauseAsync()”,但它似乎是某种异步问题之类的。

参考文献

对此问题的任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 请发布代码而不是代码图片,这些图片不适合移动设备,不可搜索,不可复制和粘贴,不适合屏幕阅读器。
  • @jnpdx 抱歉。刚刚更新了问题!

标签: react-native expo audio-player


【解决方案1】:

我已经为您需要的实施创建了一个Snack。希望对您有所帮助。非常适合我..

不要创建state 变量并将Audio 实例存储在其中。这不是实现播放列表音频功能的正确方法

首先必须将Audio 实例更改为ref。这样您就可以从代码的任何地方pause/play

在顶部创建 sound 这样的变量

const sound = useRef(new Audio.Sound());

像这样加载音频文件 -

  const LoadAudio = async (index) => {
    SetLoading(true);
    const checkLoading = await sound.current.getStatusAsync();
    if (checkLoading.isLoaded === false) {
      try {
        const result = await sound.current.loadAsync(
          Files[index].file,
          {},
          true
        );
        if (result.isLoaded === false) {
          SetLoading(false);
          SetLoaded(false);
        } else {
          sound.current.setOnPlaybackStatusUpdate(UpdateStatus);
          SetLoading(false);
          SetLoaded(true);
          SetDuration(result.durationMillis);
          PlayAudio();
        }
      } catch (error) {
        SetLoading(false);
        SetLoaded(false);
      }
    } else {
      SetLoading(false);
      SetLoaded(true);
    }
  };

Pause函数-

 const PauseAudio = async () => {
    try {
      const result = await sound.current.getStatusAsync();
      if (result.isLoaded) {
        if (result.isPlaying === true) {
          sound.current.pauseAsync();
          SetPlaying(false);
        }
      }
    } catch (error) {
      SetPlaying(true);
    }
  };

Play函数-

  const PlayAudio = async () => {
    try {
      const result = await sound.current.getStatusAsync();
      if (result.isLoaded) {
        if (result.isPlaying === false) {
          sound.current.playAsync();
          SetPlaying(true);
        }
      }
    } catch (error) {
      SetPlaying(false);
    }
  };

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @EricSchaefer 我已经添加了解释以及发生此错误的主要原因。
  • @KartikeyVaish 无法要求更好的解释。感谢您的快速回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多