1

我正在开发一个音乐流应用程序,它使用 React Native Track Player 在应用程序和后台处理音乐。

我正在通过 Socket.IO 从服务器获取音乐,并且按预期获得了所有歌曲。

在此应用程序中,管理员可以选择开始流式传输,然后连接到该应用程序的所有用户都将收到歌曲并在他们的设备上开始播放。如果用户在歌曲已经开始时连接,用户将收到歌曲和当前位置。所以,如果一首歌曲已经开始,就会寻找到当前位置。

问题是并不总是寻找工作。有时它从 0 开始,有时在一个明显随机的位置。只有几次位置很好。

我以为歌曲没有完全缓冲,但是如果我尝试输出当前位置和seek前后的缓冲位置,那就对了。

我该如何解决这个问题?我应该等待所有歌曲都被缓冲,然后寻找?

如果这个模块不能做到这一点,还有其他有效的模块吗?

我现在只在 Android 上测试了这个,idk 如果在 iOS 上有效。

这里的代码:

这是流媒体功能,从服务器收听歌曲...

socketStreaming.on("firstSong", async (song) => {
      await TrackPlayer.reset();
      await TrackPlayer.add({
        id: song.id,
        url: song.url,
        title: song.title,
        artist: song.artist,
        artwork: song.artwork,
      });
      console.log(
        `${await TrackPlayer.getBufferedPosition()} - ${await TrackPlayer.getPosition()}`
      );
      await TrackPlayer.getBufferedPosition().then(async () => {
        if (song.seekTo !== undefined) await TrackPlayer.seekTo(~~song.seekTo);
        console.log(
          `${await TrackPlayer.getBufferedPosition()} - ${await TrackPlayer.getPosition()}`
        );
      });
      await TrackPlayer.play();
      console.log(
        `${await TrackPlayer.getBufferedPosition()} - ${await TrackPlayer.getPosition()}`
      );
      setSrcButton(pauseImage);
    });
    socketStreaming.on("nextSong", async (song) => {
      await TrackPlayer.add({
        id: song.id,
        url: song.url,
        title: song.title,
        artist: song.artist,
        artwork: song.artwork,
      });
    });
    socketStreaming.on("seek", async (second) => {
      await TrackPlayer.seekTo(second);
      await TrackPlayer.play();
      setSrcButton(pauseImage);
    });

这是设置功能,设置播放器...

    await TrackPlayer.setupPlayer({
      waitForBuffer: true,
    });
    await TrackPlayer.updateOptions({
      capabilities: [
        TrackPlayer.CAPABILITY_PLAY,
        TrackPlayer.CAPABILITY_PAUSE,
        TrackPlayer.CAPABILITY_SEEK_TO,
      ],
      compactCapabilities: [
        TrackPlayer.CAPABILITY_PLAY,
        TrackPlayer.CAPABILITY_PAUSE,
      ],
      notificationCapabilities: [
        TrackPlayer.CAPABILITY_PLAY,
        TrackPlayer.CAPABILITY_PAUSE,
      ],
    });

这两个函数都在 useEffect(callback, []) 中,所以只会在启动时调用

谢谢您的帮助 :)

4

1 回答 1

0

我遇到了同样的问题。

通过先播放曲目然后寻找所需位置来解决它。

像这样的东西,

await TrackPlayer.play();
await TrackPlayer.seekTo(second);
于 2021-11-28T10:11:23.273 回答