想着练习下学习下 ijkplayer ,但不知道做个啥,就想着做个今日头条类似的视频播放列表,当item滑出了可视区域就自动播放下一个视频,因为播放器需要opengl渲染,所以就需要glsurfaceview,最开始的思路就是每个item都有一个surfaceview然后新建一个IjkMediaPlayer.使用后发现还没加入播放等动作就已经卡顿的不得了。如下图:

条状图就是手机开启了gpu呈现模式分析(在绿色横线以下就是每帧<=16ms)大于就是有些卡顿了,对于滚动界面来说就有必要优化了。

后来改换思路整个列表只使用一个MyVideoView(glsurfaceview+ijkplayer的整合)
然后通过addview到指定的item中,然后跟随滑动,就普通的addview,removeview这两个操作就已经要60ms左右,这对于一个滑动列表肯定也是不行的,不过相对之前已经有所进步了。

最后想干脆我也不addview进去了,直接新建一个MyVideoView,滑动的时候跟随着滑动,不addview也不用removeview,就简单的跟随滑动,发现要完全滑出了界面,就自动播放下一个item视频。

滑动效果如下:感觉已经能满足需求了(视频的播放暂停,进度条没加入进去,这个不会影响滑动卡顿问题,添加简单所以就没继续写了。)

gif效果图:

现在简单看看代码:
MyVideoView(是GlSurfaceView 和ijkPlayer的封装):

public void play(final String path) {new Thread() {@Overridepublic void run() {super.run();synchronized (MyVideoView.class) {try {playRelease();player = new IjkMediaPlayer();player.setDisplay(surfaceView.getHolder());player.setAudioStreamType(AudioManager.STREAM_MUSIC);player.setDataSource(path);player.prepareAsync();player.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(IMediaPlayer iMediaPlayer) {if (lis != null) lis.startSuccess();iMediaPlayer.start();Log.e("xhc", " start ...");}});} catch (Exception e) {e.printStackTrace();}}}}.start();
}

将Ijkplayer的释放,新建,都是在子线程中处理的,为的就是不阻塞主线程。

下面来看看recycleview的滑动事件的监听把:

 if(currentPosition >= 0 && currentPosition < adapter.getItemCount()){/*** 1.正在播放的视频已经滑出去,a.自动播放下一条,autoPlay = true b.播放器停止autoPlay = false* 2.正在播放的视频还在可视区域 a.继续播放*/if(currentPosition < linearLayoutManager.findFirstVisibleItemPosition() && autoPlay){//自动播放下一条lastPosition = currentPosition;currentPosition = linearLayoutManager.findFirstVisibleItemPosition();playVideo(currentPosition , listVB.get(currentPosition));}else if(currentPosition > linearLayoutManager.findLastVisibleItemPosition() && autoPlay){lastPosition = currentPosition;currentPosition = linearLayoutManager.findLastVisibleItemPosition();playVideo(currentPosition , listVB.get(currentPosition));}else if((currentPosition < linearLayoutManager.findFirstVisibleItemPosition() ||currentPosition > linearLayoutManager.findLastVisibleItemPosition()) && !autoPlay){//没有自动播放,如果超出了可视区域直接停止播放器new Thread(){@Overridepublic void run() {super.run();mv.playRelease();}}.start();return ;}contain.setTranslationY(linearLayoutManager.findViewByPosition(currentPosition).getY());}
}

基本逻辑就是
1.当前播放的视频的position是比当前可视界面的第一个item的position还小,那么就播放下一个
2.如果当前视频的item的position比可视界面的最后一个还大,就播放上条视频。

VideoBean vb = new VideoBean();
vb.setVideoPath("sdcard/FFmpeg/video_src/v1080.mp4");VideoBean vb2 = new VideoBean();
vb2.setVideoPath("sdcard/FFmpeg/video_src/test.mp4");VideoBean vb3 = new VideoBean();
vb3.setVideoPath("sdcard/FFmpeg/video_src/time.mp4");VideoBean vb4 = new VideoBean();
vb4.setVideoPath("sdcard/FFmpeg/video_src/input.mp4");VideoBean vb5 = new VideoBean();
vb5.setVideoPath("rtmp://58.200.131.2:1935/livetv/hunantv");VideoBean vb6 = new VideoBean();
vb6.setVideoPath("rtmp://media3.sinovision.net:1935/live/livestream");

测试视频有本地一些mp4和一些rmtp网络流,因为rtmp的网络给予tcp并且自己也要握手,所以加载时间更久点。

视频的测试文件在项目中可看到

这里可以找到测试文件

源码地址

音视频之模拟今日头条列表视频相关推荐

  1. Python3爬取今日头条文章视频数据,完美解决as、cp、_signature的加密方法(2020-6-29版)

    前言 在这里我就不再一一介绍每个步骤的具体操作了,因为在爬取老版今日头条数据的时候都已经讲的非常清楚了,所以在这里我只会在重点上讲述这个是这么实现的,如果想要看具体步骤请先去看我今日头条的文章内容,里 ...

  2. 视频伪原创今日头条 视频md5修改器wuai

             视频伪原创今日头条 视频md5修改器wuai          无论是资本投资,还是平台建设上,短视频始终都缺少自己独特的运行模式.                      在短视 ...

  3. 获取“今日头条”西瓜视频

    PC端获取今日头条西瓜视频 测试浏览器:Google || 火狐 Google获取视频方法 打开需要保存的视频当前播放页面[点击播放] F12 大法获取视频链接地址[复制下来:Ctrl+C] 打开一个 ...

  4. 趣头条今日头条的视频何谓伪原创

             趣头条今日头条的视频何谓伪原创       关注祥瑞自媒体,了解更多视频搬运干货!          如果你想在今天的头条新闻中赚更多钱,你必须努力打开原版.,在正常情况下,您可以在 ...

  5. 《今日头条中视频搬运项目》3-5天就可以产生利润【教程目录】

    沉睡者IT:<今日头条中视频搬运项目>只需要一部手机3-5天就可以产生利润 培训课程视频内容介绍: 今日头条多久产生利润:一般情况3-5天就可以,大概就是这个范围,也有很多一天就开始出货的 ...

  6. 短视频风口持续 今日头条再投10亿补贴火山小视频

    去年,以papi酱为代表的网络红人开启了短视频内容创作的春天,短视频一时风头无两,成为移动互联网流量的新入口,并吸引用户和行业人士的高度关注.近日,腾讯应用宝发布的"星APP"5月 ...

  7. python分析并爬取今日头条的视频链接

    如题,分析并爬取今日头条的视频链接 代码仅供交流使用 一.分析 1.进入现在的官网http://www.365yg.com/,然后通过抓包发现首页数据的走向,一般来说首页数据放在网页中,要不然就是用j ...

  8. 头条号发视频一直重复,求消重方法 今日头条发视频重复,怎么消重去重伪原创...

    视频消重原理批量处理去重消重去水印去logo软件 如何给西瓜视频消重批量处理去重消重去水印去logo软件 头条号视频重复修改md5批量处理去重消重去水印去logo软件 今日头条短视频搬运方法,批量处理 ...

  9. 今日头条竖屏视频没有收益吗,今日头条竖版视频没收益怎么回事

    今天给大家分享五点我们新手做自媒体最容易犯的错误,希望可以让你们少走些弯路. 第一:开通自己的头条号 我们一定要去开通自己的一个头条号,成为一个创作者.有的人,他只是下载了一个今日头条app,并没有去 ...

最新文章

  1. phpinfo查看可以解析的后缀_配置nginx,Apache支持pathinfo模式-什么是phpinfo模式
  2. Autodesk PowerInspect 2021中文版
  3. 大规模神经网络最新文献综述:训练高效DNN、节省内存使用、优化器设计
  4. 工业以太网交换机常见故障排除的三种方法
  5. 转://Linux Multipath多路径配置与使用案例
  6. Spark和机器学习整合
  7. spring 主从表_听听京东架构师浅谈,MySQL binlog 主从同步
  8. js 获取对象属性个数
  9. cpc卡内计费信息异常包括_抖音信息流广告收费标准,抖音广告效果分析
  10. 新员工进入公司,应告知的工作纪律
  11. 太极发送卡片软件_太极APP的入门级使用方法
  12. pl/mysql安装_PL/SQL环境安装设置
  13. MySQL计算机机房管理系统,学校机房管理系统
  14. com词根词缀_英语词根词缀,cor和con分别代表什么意思
  15. Mybatis注解开发指北
  16. LANDESK8.8版本操作说明书之核心服务器管理
  17. VS2019菜单栏的项目、生成、格式三个菜单栏不见了
  18. 元素水平垂直居中的六种方式
  19. 奋斗吧,程序员!——第二章 君因风送入青云,我被人驱向鸭群
  20. NCCloud OpenAPI扩展开发

热门文章

  1. 我的世界服务端大全-服务器插件等相关网站推荐
  2. iphonex蓝牙打不开转圈_苹果6 plus蓝牙打不开总转圈怎么处理?
  3. 开发android怎么开发ios app,怎么开发ios android 都能使用的app
  4. HEVC视频扩展解决方法
  5. 网页中播放RTSP(5) WebSocket播放视频
  6. WIN10系统在中国知网下载期刊封面、扉页、目录的PDF版本
  7. Codeforces Round #439 (Div. 2) A. The Artful Expedient
  8. Android Studio调用百度地图(二):实现地图显示后台定位和步行导航
  9. 爬全景网壁纸(反爬机制Referer)
  10. Shiro和Spring Security的简单对比