Spotify 的 Android SDK 无法可靠地播放持续时间较短的歌曲

Spotify's Android SDK can't play songs with short duration reliably

TL;DR

我正在尝试使用 Spotify Android SDK 播放时长小于 10 40 秒(很难说)的歌曲。我正在使用一个按钮开始播放。这样做时,大部分时间都没有声音。向按钮发送垃圾邮件会导致偶尔播放声音(几乎不会发生)。 PlayerEventkSpPlaybackNotifyTrackChanged&kSpPlaybackEventAudioFlush如果没有声音就是缺失

描述

我正在使用 Spotify's Android SDK (Docs)。我正在尝试使用 playUri(...) 播放歌曲。即使达到 Player.OperationCallbackonSuccess,某些歌曲在调用 playUri(...) 后根本不会呈现任何声音。在另一个更复杂的测试环境中,我发现 Player.AudioDeliveredCallback 甚至在出现此行为时都没有被调用。非工作轨道的一个共同点是它们很短(持续时间少于 10 40(很难说)秒)。 我正在使用 Android SDK 版本 spotify-player-24-noconnect-2.20b 并在设备 运行 Android OS 版本 4.4.2 & 7.0 上进行调试。

我还在 Spotify Android SDK 中将此列为一个问题,可以在 here.

中找到

重现步骤

我使用 this 作为起点。我删除了所有与身份验证相关的代码,因为我只是自己使用 Web API 获取 OAuth 令牌。我也忽略了应该在 Spotify 应用程序中提供的 Android 包名称和 SHA1 指纹对,因为它似乎甚至没有被服务检查。播放器正在正确初始化,我可以看出这一点,因为有些歌曲播放没有任何问题。因此 ConnectionStateCallbackonLoggedIn() 在短时间后被调用。调试日志消息确认登录过程成功。成功登录后 playUri(...) 可以通过使用 Spotify URI 调用它来使用。 View.OnClickListeneronClick(...) 方法的以下实现用于五个不同的 Button 方法,它们利用 playUri(...) 和一个工作(按钮 5)和一些不工作(按钮1-4) Spotify URI。

public void onButtonClickedPlaySong1(View view) {
  Log.d("MainActivity", "Playing short song");
  mPlayer.playUri(null, "spotify:track:5vN4teJoROMQoadL4IzejG", 0, 0);
}

public void onButtonClickedPlaySong2(View view) {
  Log.d("MainActivity", "Playing short song");
  mPlayer.playUri(null, "spotify:track:46O6QtxuzX3iZn9hMXoeqo", 0, 0);
}

public void onButtonClickedPlaySong3(View view) {
  Log.d("MainActivity", "Playing short song");
  mPlayer.playUri(null, "spotify:track:770fJdqw14GUyCe2SMEgvP", 0, 0);
}

public void onButtonClickedPlaySong4(View view) {
  Log.d("MainActivity", "Playing short song");
  mPlayer.playUri(null, "spotify:track:4JjsoAKOZZCZuC0kiYwkTL", 0, 0);
}

public void onButtonClickedPlaySong5(View view) {
  Log.d("MainActivity", "Playing long song");
  mPlayer.playUri(null, "spotify:track:3CCCpjbs3uW018OkSguRFk", 0, 0);
}

实际行为

按钮 1、2、3 和 4 应开始播放一首短歌。 按钮 5 应该开始播放一首长歌。

预期行为

日志

以下日志主要显示Player.NotificationCallbackonPlaybackEvent(PlayerEvent playerEvent)次调用。

按下按钮 5:

02-24 13:19:15.500 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playing long song
02-24 13:19:15.516 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyPlay
02-24 13:19:15.574 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyMetadataChanged
02-24 13:19:15.692 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyMetadataChanged
02-24 13:19:15.692 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyMetadataChanged
02-24 13:19:15.692 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyContextChanged
02-24 13:19:15.791 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyTrackChanged
02-24 13:19:15.791 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackEventAudioFlush

按下按钮 1、2、3 或 4:

02-24 13:20:04.286 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playing short song
02-24 13:20:04.307 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyPlay
02-24 13:20:04.357 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyMetadataChanged
02-24 13:20:04.463 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyMetadataChanged
02-24 13:20:04.463 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyMetadataChanged
02-24 13:20:04.463 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyContextChanged

在之前按下按钮 1、2、3 或 4 之后按下:

02-24 13:20:06.020 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playing short song
02-24 13:20:06.035 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyPlay
02-24 13:20:06.088 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyMetadataChanged
02-24 13:20:06.179 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyMetadataChanged
02-24 13:20:06.179 5766-5766/<YOUR_PACKAGE> D/MainActivity: Playback event received: kSpPlaybackNotifyMetadataChanged

我确实找到了解决问题的办法。 playUri(...) 的最后一个参数是一个整数,在文档中称为 "positionInMs" 。当将它设置为 1 而不是 0 时,无论要播放的歌曲的持续时间如何,我都没有任何问题。

从技术上讲,这首歌似乎被削减了 1 毫秒,我认为这是一个非常肮脏的修复。但实际上它根本不引人注意,这就是我对它很满意的原因。