我正在尝试实现 expo-av 来加载音频流。它可以工作,但它会在大约 25 秒内加载音频,我发现这太慢了...我没有看到用户等待 25 秒来加载音频,他只会认为它不起作用并退出我的应用程序。
这是我的代码:
import { Audio } from "expo-av";
const streamUr = "https://adminradiosulamita.store:8000/radio.mp3";
import { Sound } from "expo-av/build/Audio";
export default function HomeScreen() {
const [sound, setSound] = useState<Sound>();
const [loading, setLoading] = useState(false);
async function playSound() {
setLoading(true);
// const { sound } = await Audio.Sound.createAsync(
// {
// uri: streamUrl,
// headers: {
// Range: "bytes=0-",
// // pass aditional headers so it knows its an audio stream
// "Content-Type": "audio/mpeg",
// "Icy-MetaData": "1",
// },
// },
// {
// shouldPlay: true,
// }
// );
const sound = new Audio.Sound();
await sound.loadAsync(
{
uri: streamUrl,
},
{
shouldPlay: true,
}
);
setSound(sound);
await sound.playAsync();
setLoading(false);
}
useEffect(() => {
return sound
? () => {
sound.unloadAsync();
}
: undefined;
}, [sound]);
return (
<ParallaxScrollView>
<ThemedView style={styles.titleContainer}>
<TouchableOpacity onPress={playSound}>
<ThemedText type="title">Play</ThemedText>
</TouchableOpacity>
<ThemedText type="title">
{loading ? "Cargando" : "No cargando"}
</ThemedText>
</ThemedView>
</ParallaxScrollView>
);
}
如您所见,我尝试了不同的方法,但加载速度仍然很慢。怎么解决?
我对 expo-av 一无所知,但您可能遇到了播放器必须“嗅探”内容类型的问题,这是一个常见问题。
此流是 MP3 流。 Icecast 和 SHOUTcast 都不会为您对齐流,因此流可以从任意字节偏移量开始。 由客户端来确定 MPEG 帧边界。 首先查找一系列字节,其中 前 11 位全部设置为
1
。 编解码器会为您完成此操作,但如果播放器不知道要使用什么编解码器,它可能会在回退到 MP3 之前缓冲一些任意数据块,例如 256 KB。
您通常可以做的另一件事是告知播放器您正在使用的编解码器。 您必须查看您的框架是否允许设置
audio/mpeg
的类型。
最后,如果您可以调整任何缓冲区大小,请这样做。 128 kbit/s 音频不需要太多数据。 如果它确实是没有服务器端缓冲区的实时流,那么可能需要很多秒来缓冲播放器认为需要保持稳定的播放速率。 请记住,这些播放器默认针对视频进行调整,并且通常会缓冲固定的最小量。