如何使用 expo-av 在本机反应中播放背景音频?

Posted

技术标签:

【中文标题】如何使用 expo-av 在本机反应中播放背景音频?【英文标题】:How to play background audio in react native using 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)
    
  

【问题讨论】:

【参考方案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(...) 设置的第一部分。太好了!!!

以上是关于如何使用 expo-av 在本机反应中播放背景音频?的主要内容,如果未能解决你的问题,请参考以下文章

使用本机反应播放 .Flac 或 .Alac 文件,甚至可以在 iPhone 上使用吗?

如何在本机反应中呈现html音频标签?

如何在启动另一个反应音频播放器时停止播放?

ReactNative:Expo-AV 将声音播放对象放入 Redux 存储是不是可以/正确?

如何在 Windows Phone 8 应用程序中播放循环背景音频(不使用 BackroundAudio 服务)?

一首歌在反应音频播放器中结束后,我想播放下一首歌曲。我已经获得了指向数组的所有歌曲链接,但不确定如何实现 func