我正在为广播流应用程序开发 ExoPlayer 2.6.0。收音机播放很好,但是当我尝试添加 seekTo +/-30 秒时,它总是从 0 开始流式传输。在调试模式下,播放器搜索到 +30 秒,但一旦设置了 setPlayWhenReady() 它就会返回从 0 开始。我一直在寻找这个解决方案很久了,所以决定在这里提问。任何帮助将不胜感激。
以下是我用于 seekto 操作的代码。
ivForward.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
if (exoPlayer != null && Constants.isMediaPlaying) {
exoPlayer.setPlayWhenReady(false);
Constants.isMediaPlaying = false;
long bufferPosition = exoPlayer.getBufferedPosition();
long currentPosition = exoPlayer.getCurrentPosition();
if ((currentPosition + 30000) < bufferPosition + 50) {
exoPlayer.setPlayWhenReady(false);
Constants.isMediaPlaying = false;
exoPlayer.seekTo(exoPlayer.getCurrentWindowIndex(), currentPosition + 30000);
exoPlayer.setPlayWhenReady(true);
Constants.isMediaPlaying = true;
}
}
} catch (Exception e) {
MakeToast.show("Error moving forward");
}
} …Run Code Online (Sandbox Code Playgroud) 我正在使用AVPlayer传输音频.它运作良好.但是现在我需要制作一个滑块来向前和向后移动音频,就像典型的音乐播放器一样.我使用了seekToTime与本地音频文件一起使用的功能.但是当我从网址流传输歌曲时,当我转发大范围的滑块时,该功能会停止音频.
我的猜测是正在下载歌曲,如果我向前移动大范围的滑块,那么系统可能没有下载当时的歌曲数据包,所以它会停止播放器.
让我说我只是按一个按钮来播放歌曲,但现在我立即在0到100秒移动滑块.在这种情况下,系统无法正常工作并停止播放器.由于当时缺少数据包.
有谁知道如何克服这个问题或有任何其他方法.我正在使用SWIFT进行开发.如果它可以在swift中工作,我也可以使用任何库.这是我的功能:
func forward () {
timeGap = slider.value
let preferredTimeScale : Int32 = 1
let targetTime : CMTime = CMTimeMake(timeGap, preferredTimeScale)
player.seekToTime(targetTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我有一个mp3文件,我的应用程序必须寻找该mp3文件的某些选定时间,然后从那里开始播放.
我通过此方法将字符串时间转换为int值
private static int convert(String time) {
int quoteInd = time.indexOf(":");
int pointInd = time.indexOf(".");
int min = Integer.valueOf(time.substring(0, quoteInd));
int sec = Integer.valueOf(time.substring(++quoteInd, pointInd));
int mil = Integer.valueOf(time.substring(++pointInd, time.length()));
return (((min * 60) + sec) * 1000) + mil;
}
Run Code Online (Sandbox Code Playgroud)
注意:我的蜇声是这样的5:12.201,意味着5分12秒和201毫秒.
我从MP3 Audio Editor应用程序(它是用于Windows)中获取这些时间,并且我使用KMPlayer应用程序检查主题(它是用于Windows).这些时间对他们两个都是正确的.
但是在我的应用程序中,当我寻找MediaPlayer那个时间时,音频不会从我选择的位置开始. (时间是正确的,但声音是不同的.)
我以为MediaPlayer没有正确地寻求那个时间.所以我getCurrentPosition()在玩之前通过调用检查当前位置,但是返回值并且搜索值相同.
我对它没有任何想法.
编辑:
我的问题不是时间转换.
我正确地转换并寻求到那里,但它发挥了那个时代不期望的东西.
这意味着KMPlayer和Android的时机不同.
我的问题是Way?而如何能为解决呢?
我正在一个应用程序中工作,在该应用程序中,我可以使用 AVPlayer 实例播放流媒体广播(仅限音频)的 HLS m3u8 播放列表而没有任何问题。使用 Charles 我可以看到播放列表是如何以正常速度正确更新的(每 9-10 秒,这需要一个媒体片段文件)。当我执行seekToTime:(回到过去)时,播放器从我想要的时候开始成功播放流,但在Charles中我观察到播放器如何开始下载大量媒体片段文件,消耗大量数据。似乎播放器下载所有媒体段文件直到那个时候,然后再次保持正常行为。
我知道正确的行为是在我想要的时间下载媒体片段文件,开始播放它,然后每 9-10 秒不断下载 1 或 2 个媒体片段文件,就像我播放流时一样没有时移。
我的问题是这是否是正常行为,或者我的 m3u8 播放列表或客户端实现是否有问题。任何人都可以帮我澄清这一点吗?
更新:我可以确认这不会发生在 iOS 7 中,所以它似乎是 iOS 8 引入的错误。
seektotime ×4
avplayer ×2
ios ×2
android ×1
audio ×1
avplayeritem ×1
exoplayer ×1
exoplayer2.x ×1
mp3 ×1
swift ×1