【问题标题】:How to play background audio in react native using expo-av?如何使用 expo-av 在本机反应中播放背景音频?
【发布时间】:2020-08-23 13:07:38
【问题描述】:

我正在使用 expo 构建一个反应原生应用程序。我正在使用“expo-av”。

我的音频文件无法在后台播放。

我有以下内容,但当我将我的应用程序切换到另一个应用程序时仍然无法让它工作。我没有收到任何错误;音乐只是在我的应用程序中停止。关于如何让它发挥作用的任何建议?还是我的代码可能在其他地方关闭?

  async componentDidMount() {
    try {
      await Audio.setAudioModeAsync({
        allowsRecordingIOS: false,
        interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_MIX_WITH_OTHERS,
        // interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DUCK_OTHERS,
        playsInSilentModeIOS: true,
        interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DUCK_OTHERS,
        shouldDuckAndroid: true,
        staysActiveInBackground: true,
        playThroughEarpieceAndroid: true
      })
      this.loadAudio();
    //   this.interval = setInterval(() => this.getStatus(), 1000);
    } catch (e) {
      console.log(e)
    }
  }

【问题讨论】:

    标签: react-native expo


    【解决方案1】:

    一切都与这些参数一起工作:

    Audio.setAudioModeAsync({
       allowsRecordingIOS: false,
       staysActiveInBackground: true,
       interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DUCK_OTHERS,
       playsInSilentModeIOS: true,
       shouldDuckAndroid: true,
       interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DUCK_OTHERS,
       playThroughEarpieceAndroid: false
    });
    

    在 package.json 中 "expo-av": "^6.0.0",

    在播放器中:

    componentDidMount() {
            Audio.setAudioModeAsync({
                allowsRecordingIOS: false,
                staysActiveInBackground: true,
                interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DUCK_OTHERS,
                playsInSilentModeIOS: true,
                shouldDuckAndroid: true,
                interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DUCK_OTHERS,
                playThroughEarpieceAndroid: false
            });
            this._loadNewPlaybackInstance(true);
        }
    
    async _loadNewPlaybackInstance(playing) {
            if (this.playbackInstance != null) {
                await this.playbackInstance.unloadAsync();
                this.playbackInstance = null;
            }
    const source = { uri: 'http://music.ru/music.mp3' };
    
        const initialStatus = {
            shouldPlay: playing,
            rate: this.state.rate,
            shouldCorrectPitch: this.state.shouldCorrectPitch,
            volume: this.state.volume,
            isMuted: this.state.muted,
            isLooping: this.state.loopingType === LOOPING_TYPE_ONE
            // // UNCOMMENT THIS TO TEST THE OLD androidImplementation:
            // androidImplementation: 'MediaPlayer',
        };
        const {sound, status} = await Audio.Sound.createAsync(
            source,
            initialStatus,
            this._onPlaybackStatusUpdate
        );
        this.playbackInstance = sound;
    

    【讨论】:

    • 您能解释一下为什么您的更改有效吗?原始海报缺少什么?
    • 也许 playThroughEarpieceAndroid: false
    • 你这个摇滚人,这完全符合我的预期!在我的代码中,我只是在实际运行.playAsync() 方法之前使用了关于添加Audio.setAudioModeAsync({...}) 设置的第一部分。太好了!!!
    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多