Expo AV音频在ios上听不见



大家好,我正在使用Expo AV在我的React Native(Expo管理的(应用程序中播放声音,音频在android上播放良好且可听,但在ios上播放不大声且可听。苹果也因为这个而拒绝了app Store上的应用程序

他们说

您的应用程序在Info.plist中的UIBackgroundModes键中声明支持音频,但不包括需要持久音频的功能
下一步
音频键适用于在后台为用户提供音频内容的应用程序,如音乐播放器或流媒体音频应用程序。请修改您的应用程序以在应用程序处于后台时向用户提供可听见的内容;音频";设置。

这是expo av音频模式设置

Audio.setAudioModeAsync({
staysActiveInBackground: true,
shouldDuckAndroid: true,
interruptionModeIOS: 1,
interruptionModeAndroid: 1,
allowsRecordingIOS: true,
playsInSilentModeIOS: false,
})

我像一样播放音频

const {sound} = await Audio.Sound.createAsync(
{uri: audioURI},
{
shouldPlay: true,
}
);

这是导入语句

import { Audio } from 'expo-av';

我不知道这是否是由我在应用中用于音乐控制的React Native音乐控制库引起的

像一样导入

import MusicControl from 'react-native-music-control'

我在播放完音频后立即调用它

MusicControl.setNowPlaying({
title: currentAudio.title,
artwork: currentAudio.imageUrl, // URL or RN's image require()
artist: currentAudio.artist,
genre: currentAudio.genre,
duration: (minutesToMilliseconds(currentAudio.playtime) / 1000), // (Seconds)
description: currentAudio.description, // Android Only
color: 0xffffff, // Android Only - Notification Color
colorized: true, // Android 8+ Only - Notification Color extracted from the artwork. Set to false to use the color property instead
isLiveStream: false, // iOS Only (Boolean), Show or hide Live Indicator instead of seekbar on lock screen for live streams. Default value is false.
})

请问我做错了什么,提前感谢的帮助

我已经修复了

如何?

我认为是react-native-music-control导致了它,我在一个函数中配置了Expo AV Audio和react-native-music-control,并在应用的一个主文件中的React.useLayoutEffect中调用了该函数

但我发现,如果我改变了功能,音频就会被听到

所以我所做的是在调用Audio.Sound.createAsync(...)之后调用函数

const {sound} = await Audio.Sound.createAsync(
{ uri: audioDetails.url, },
{
shouldPlay: true,
},
(status: AVPlaybackStatus) => 
onPlaybackStatusUpdate(...),
false

);
useAppGlobalContextIn.initializeMusicControl() // the function where I called the Expo AV Audio and the MusicControl setup

功能

const initializeMusicControl = React.useCallback(() => {
MusicControl.setCustomNotificationIcon(require('./assets/icon.png'))
MusicControl.enableBackgroundMode(true);
MusicControl.handleAudioInterruptions(true);
// // // Basic Controls
MusicControl.enableControl('play', true)
MusicControl.enableControl('pause', true)
MusicControl.enableControl('stop', true)
MusicControl.enableControl('nextTrack', true)
MusicControl.enableControl('previousTrack', true)
// // // Changing track position on lockscreen
MusicControl.enableControl('changePlaybackPosition', true)
// // Seeking
MusicControl.enableControl('seekForward', false) // iOS only
MusicControl.enableControl('seekBackward', false) // iOS only
MusicControl.enableControl('skipForward', false)
MusicControl.enableControl('skipBackward', false)

// // Android Specific Options
MusicControl.enableControl('seek', true) // Android only
MusicControl.enableControl('setRating', false)
MusicControl.enableControl('volume', true) // Only affected when remoteVolume is enabled
MusicControl.enableControl('remoteVolume', true)
MusicControl.enableControl('closeNotification', true, { when: 'always' })

// // // iOS Specific Options
MusicControl.enableControl('enableLanguageOption', false)
MusicControl.enableControl('disableLanguageOption', false)
Audio.setAudioModeAsync({
staysActiveInBackground: true,
shouldDuckAndroid: true,
interruptionModeIOS: 1,
interruptionModeAndroid: 1,
allowsRecordingIOS: true,
playsInSilentModeIOS: true,
})
}, [])

然后我把它叫做

React.useLayoutEffect(() => {
initializeMusicControl()
}, [])

这有点棘手,但当我遇到Expo AV Audio的另一个问题时,我决定改用react原生音轨播放器,它工作得很好,它既能处理Expo AV音频和react-native-music-control的功能,也能提供令人难以置信的事件来处理远程事件

最新更新