我正在使用ExoPlayer流视频中的回收视图。
我正在ViewHolder中的RecyclerView适配器的绑定方法中实现ExoPlayer。
我使用的视频格式是m3u8,我使用的URL在浏览器中工作。所以我知道视频链接是有效的。我还测试了一个youtube链接。
以下是Recyclerview适配器的ViewHolder中的代码-
class ViewHolder private constructor(val binding: FeedRowBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(context: Activity){
if (entity.content.videolink != null) {
setupVideoPlayer(entity.content.videolink, context)
}
}
}
private fun setupVideoPlayer(url: String, context: Activity) {
val videoExoPlayer = SimpleExoPlayer.Builder(binding.videoView.context).build()
videoExoPlayer.prepare(createUrlMediaSource(url, context))
binding.play.setOnClickListener {
videoExoPlayer.playWhenReady = true
}
binding.pause.setOnClickListener {
videoExoPlayer.playWhenReady = false
}
}
private fun createUrlMediaSource(url: String, context: Activity): MediaSource {
val userAgent = Util.getUserAgent(context, context.getString(R.string.about))
return ProgressiveMediaSource
.Factory(DefaultDataSourceFactory(context, userAgent), DefaultExtractorsFactory())
.createMediaSource(Uri.parse(url))
}
当加载我的recyclerview并带着视频进入该行时,我发现以下错误:
com.google.android.exoplayer2.source.无法识别的InputFormat异常:没有一个可用的提取器(MatroskaExtrator,FragmentedMp4Extrator,Mp4Extrator,Mp3Extrator,AdtsExtrator,Ac3Extrator,TsExtrator,FlvExtrator,OggExtrator,PsExtrator,WavExtrator,AmrExtrator,Ac4Extrator,FlacExtrator)可以读取流。在com.google.android.exoplayer2.source.ProgressiveMedia期限$ExtratorHolder.select提取器(ProgressiveMediaPeriod.java:1090)在com.google.android.exoplayer2.source.ProgressiveMedia期限$提取Loadable.load(ProgressiveMediaPeriod.java:969)在com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)在java.util.concurrent.ThreadPoolExecator$Worker.run(ThreadPoolExecutor.java:636)在java.lang.Thread.run(Thread.java:764)
我不确定我做错了什么,关于如何解决这个问题有什么想法吗?
在Android 4.1上,您可以https://github.com/brianwernick/ExoMedia/使用这个库。阅读页面上提到的示例应该足以让您开始。我已经复制了该代码片段,并添加/修改了一些内容。
private void setupVideoView() {
EMVideoView emVideoView = (EMVideoView)findViewById(R.id.video_play_activity_video_view);
emVideoView.setOnPreparedListener(this);
//Enter your m3u8 URL below
emVideoView.setVideoURI(Uri.parse("http://SOMESERVER/playlist.m3u8"));
}
@Override
public void onPrepared(MediaPlayer mp) {
//Starts the video playback as soon as it is ready
emVideoView.start();
}
@Override
public void onPause() {
super.onPause();
//Pause Video Playback
emVideoView.pause();
}
我不认为m3u8是一种视频格式,而是一种播放列表格式。我认为Exoplayer比处理播放列表更低级别;可能你需要自己阅读m3u8文件,然后自己传入播放列表中的链接。
幸运的是,文件格式并不复杂,解析起来也不太困难。似乎有很好的记录。维基百科上甚至有一些例子:https://en.wikipedia.org/wiki/M3U
您需要修改createUrlMediaSource
private fun createUrlMediaSource(url: String, context: Activity): MediaSource {
val userAgent = Util.getUserAgent(context, context.getString(R.string.about))
return ProgressiveMediaSource
.Factory(DefaultDataSourceFactory(context, userAgent), DefaultExtractorsFactory())
.createMediaSource(Uri.parse(url))
}
如中所述https://exoplayer.dev
DashMediaSource
用于DASH
因此,您需要将函数替换为:
private fun createUrlMediaSource(url: String, context: Activity): MediaSource {
val userAgent = Util.getUserAgent(context, context.getString(R.string.about))
return HlsMediaSource
.Factory(DefaultDataSourceFactory(context, userAgent), DefaultExtractorsFactory())
.createMediaSource(Uri.parse(url))
}
在遵循《开发者指南》中给出的示例之后,我得到了以下信息: 设置: 布局: 完整日志: 网址肯定有效(我已经尝试了其他几个)。我错过了什么? 更新: 当我在本地加载视频时,播放器确实工作了。不过这并不能解决我的问题。
这个应用程序直接从应用编程接口获取数据。当它运行时,会发生这种类型的错误。基本上,我认为错误发生在getItemCount()方法中,但我无法解决这个问题。我已经附上了错误文件和整个代码。如果你能解决这个错误,我将不胜感激。 JAVAlang.NullPointerException:尝试调用接口方法“int java”。util。列表com上的空对象引用上的size()。techbrightso
我从Web API服务中获取数据,来自反应原生ios项目,我收到了这条消息 RCTURLRequestHandlers RCTDataRequestHandler:0x7a11c0e0和RCTImageStoreManager:0x7a6c46a0都报告它们可以处理请求NSURLRequest:0x7a28bb10{URL:%0D%0A%0D%0Ahttps://webApiURL/post1.p
我在recyclerView中遇到错误// 数据类类别( )这是模型///// 对象类别模型{ ////适配器/// 类CategoriesAdapter(private val itemList:ArrayList):RecyclerView。适配器 .充气(R.layout.memmals,parent,false)返回ViewHolder(视图) }/////主要活动/// 类MainAct
我有一些关于适配器的问题,这是我的方法: 另一个Java:1。名单。Java }
在最近升级了我的android工作室后,我不能再构建我的项目了。 重建、清理项目和使缓存无效都不起作用! 添加android.enableaapt2=false行并不能解决真正的问题,因此我宁愿找到问题的根源。 下面显示了我的gradle.build文件: