我正在开发一个应用程序,它可以流式传输mp3文件列表,为此,我使用了ExoPlayer和连接MediaSource
,如下所示:
private fun createMediaSource(
tracks: List<Track>
): MediaSource = ConcatenatingMediaSource(true).apply {
tracks.forEach { track ->
val mediaSource = ProgressiveMediaSource
.Factory(DefaultDataSourceFactory(context))
.createMediaSource(MediaItem.fromUri(track.getFullUri()))
addMediaSource(mediaSource)
}
}
这很好,文件以列表的形式播放,完全没有错误,但是我需要的是将所有这些流作为一个流播放,我在搜索栏上显示所有流的总长度,用户将在它们之间无缝搜索。
当然,我没有使用ExoPlayer提供的VideoPlayer,因为我需要seekbar来跨越所有媒体源,这显然是ExoPlayerUi无法做到的。
这就是我在用户尝试搜索时使用的逻辑:
exoPlayer.apply {
var previousTracksLength = 0L
var windowIndex = 0
var currentItemLength = 0L
run loop@{
tracksList.forEachIndexed { index, track ->
currentItemLength = track.getLengthMillis()
previousTracksLength += currentItemLength
if (newPositionMillis < previousTracksLength) {
windowIndex = index
return@loop
}
}
}
val positionForCurrentTrack = (newPositionMillis - (previousTracksLength - currentItemLength))
pause()
if (windowIndex == currentWindowIndex) {
seekTo(positionForCurrentTrack)
} else {
seekTo(windowIndex, positionForCurrentTrack)
}
play()
}
当ConcatenatingMediaSource只有3个或更少的媒体源时,这种效果非常好,但是如果它比这个大,奇怪的行为就会开始出现,我可能只想向前寻求10秒,而玩家会移动2分钟以上。
调试后,我很明显,当我调用时:seekTo(windowIndex,positionForCurrentTrack)
exoPlayer正在寻找一个未与连接MediaSource中的特定媒体源映射的窗口!
下面是我的问题:
ExoPlayer是否为ConcatenatingMediaSource中的每个mediaSource创建一个窗口?如果没有,有没有办法强制它这样做?
这并不是一个真正的答案,但解释为什么当我调用seekTo(windowIndex,position)
时,播放器似乎忽略了windowIndex,实际上是在寻找一个完全出乎意料的位置,因为媒体类型是mp3!
显然,许多开发人员都遇到了同样的问题,即玩家寻找的位置与MP3播放的媒体的真实位置不同步。
在使用ExoPlayer播放mp3时遇到奇怪问题的人的更多详细信息https://github.com/google/ExoPlayer/issues/6787#issuecomment-568180969
我正在使用在我的android应用程序中播放视频。我从服务器下载媒体并保存在本地数据库中,在特定的时间报警时,我在exo player中使用播放媒体。但首先我要检查所有的视频文件是否下载,并用下载的媒体源启动播放器。如果有任何视频没有下载,那么我想在下载时在后台下载,然后我想把这个视频添加到我已经创建的播放列表中 这是示例代码 我在这里检查视频文件是否下载 如果没有下载,请帮助如何稍后将丢失的视频
我有一个应用程序,可以显示来自互联网的图片和视频。现在我正在实现一个“保存”功能,将图片/视频保存到外部或内部存储器中,无需再次下载。 对于图片,我只是用抓取绘图。我如何用Exoplayer2. x/PlayerView中当前缓冲的视频实现同样的效果?我没有找到一个函数。
所以,我在网上阅读,您不能使配置最终,因为CGLIB扩展了类以创建代理。但是,我阅读了@Scope的文档,默认的proxyMethod值是没有创建代理(此处链接-https://docs.spring.io/springframework/docs/current/javadoc-api/org/springframework/context/annotation/scope.html)。 所以,
1367[AWT-EventQueue-0]信息uk.co.caprica.vlcj.binding.libvlcfactory-libvlc:c:\program files\videolan\vlc\libvlc.dll 2061[AWT-EventQueue-0]错误uk.co.caprica.vlcj.player.DefaultMediaPlayer-未能为“SimpleMedia[mr
我正在用JavaFX开发一个音乐库应用程序,我在如何正确使用MediaPlayer类方面遇到了一些问题。 这是我目前设置和播放音频文件的方法: 比如说,我有两个音频文件。。。 ...以及将这两个文件中的一个发送到上述方法的两个按钮: 通常,两个音频文件都会相互播放是有意义的,因为每次调用该方法时我都会创建一个新的MediaPlayer对象,但是,该对象是静态的。也许我误解了静态对象的工作原理,但这
和类似的服务: 我用的是12个实体,大家的服务方式都一样。 谢谢!