前段时间由于项目需要用到类似于今日头条的视频播放器,实现在线播放,边缓存边播放,当然也可以播放本地文件,如下图:

这里写图片描述

这里我推荐大家使用的是jiecaovideoplayer开源库,这个库的播放引擎是ijkplayer,它调用ffmpeg, 原项目GitHub地址:https://github.com/lipangit/JiaoZiVideoPlayer
一、项目引入:
1、添加类库

implementation 'fm.jiecao:jiecaovideoplayer:4.8.3'
implementation 'com.github.bumptech.glide:glide:3.7.0'

2、添加布局

 <fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandardandroid:id="@+id/player_list_video"android:layout_width="match_parent"android:layout_height="220dp" />

3、下面就是我所说的通过设置视频地址、缩略图地址、标题等几行代码快速实现视频的播放啦

 JCVideoPlayerStandard player = (JCVideoPlayerStandard) findViewById(R.id.player_list_video);boolean setUp = player.setUp("http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4", JCVideoPlayer.SCREEN_LAYOUT_LIST, "");if (setUp) {Glide.with(MainActivity.this).load("http://a4.att.hudong.com/05/71/01300000057455120185716259013.jpg").into(player.thumbImageView);}

4、在Activity中

@Overridepublic void onBackPressed() {if (JCVideoPlayer.backPress()) {return;}super.onBackPressed();}@Overrideprotected void onPause() {super.onPause();JCVideoPlayer.releaseAllVideos();}

5、还有一点不要忘记哦,要添加权限滴:

<!--联网权限--><uses-permission android:name="android.permission.INTERNET" />

下面我们来看看我们运行效果:

这里写图片描述

二、如何使用jiecaovideoplayer播放本地视频
注意:jiecaovideoplayer支持file:///开头的文件播放,但是不支持assets或者raw目录下的视频,assets下的视频要先复制到本地路径才能播放,至于怎么监听播放完全呢,要继承JCvideoPlayerStandard 复写onAutoCOmplete函数

三、模拟用户点击开始按钮,直接进入全屏

 //直接进入全屏player.startFullscreen(this, JCVideoPlayerStandard.class, videoUrl, "");//模拟用户点击开始按钮,NORMAL状态下点击开始播放视频,播放中点击暂停视频player.startButton.performClick();

我把代码都贴出来吧:

package la.trytry.jiecaovideoplayer;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;import com.bumptech.glide.Glide;import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer;
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard;public class MainActivity extends AppCompatActivity {private String videoUrl = "http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4";private JCVideoPlayerStandard player;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);player = (JCVideoPlayerStandard) findViewById(R.id.player_list_video);boolean setUp = player.setUp(videoUrl, JCVideoPlayer.SCREEN_LAYOUT_LIST, "");if (setUp) {Glide.with(MainActivity.this).load("http://a4.att.hudong.com/05/71/01300000057455120185716259013.jpg").into(player.thumbImageView);}//直接进入全屏player.startFullscreen(this, JCVideoPlayerStandard.class, videoUrl, "");//模拟用户点击开始按钮,NORMAL状态下点击开始播放视频,播放中点击暂停视频player.startButton.performClick();}@Overridepublic void onBackPressed() {if (JCVideoPlayer.backPress()) {return;}super.onBackPressed();}@Overrideprotected void onPause() {super.onPause();JCVideoPlayer.releaseAllVideos();}}

四、下面回到我们的主题上,实现仿今日头条的视频播放
1、VideoActivity.java

package la.trytry.jiecaovideoplayer;import android.graphics.Rect;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.AbsListView;
import android.widget.ListView;import java.util.ArrayList;import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer;
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard;public class VideoActivity extends AppCompatActivity {private String videoUrl = "http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4";private ListView listView;private ArrayList<String> datas;private JCVideoPlayerStandard currPlayer;private VideoAdapter adapter;private AbsListView.OnScrollListener onScrollListener;private int firstVisible;//当前第一个可见的itemprivate int visibleCount;//当前可见的item个数@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_video);listView = (ListView) findViewById(R.id.listview);initDatas();initListener();}private void initDatas() {datas = new ArrayList<String>();for (int i = 0; i < 20; i++) {datas.add(videoUrl);}adapter = new VideoAdapter(VideoActivity.this, datas, R.layout.item_video);listView.setAdapter(adapter);}/*** 滑动监听*/private void initListener() {onScrollListener = new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {switch (scrollState) {case AbsListView.OnScrollListener.SCROLL_STATE_FLING:break;case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://滑动停止自动播放视频autoPlayVideo(view);break;case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:break;}}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {if (firstVisible == firstVisibleItem) {return;}firstVisible = firstVisibleItem;visibleCount = visibleItemCount;}};listView.setOnScrollListener(onScrollListener);}/*** 滑动停止自动播放视频*/private void autoPlayVideo(AbsListView view) {for (int i = 0; i < visibleCount; i++) {if (view != null && view.getChildAt(i) != null && view.getChildAt(i).findViewById(R.id.player_list_video) != null) {currPlayer = (JCVideoPlayerStandard) view.getChildAt(i).findViewById(R.id.player_list_video);Rect rect = new Rect();//获取当前view 的 位置currPlayer.getLocalVisibleRect(rect);int videoheight = currPlayer.getHeight();if (rect.top == 0 && rect.bottom == videoheight) {if (currPlayer.currentState == JCVideoPlayer.CURRENT_STATE_NORMAL|| currPlayer.currentState == JCVideoPlayer.CURRENT_STATE_ERROR) {currPlayer.startButton.performClick();}return;}}}//释放其他视频资源JCVideoPlayer.releaseAllVideos();}@Overridepublic void onBackPressed() {if (JCVideoPlayer.backPress()) {return;}super.onBackPressed();}@Overrideprotected void onPause() {super.onPause();JCVideoPlayer.releaseAllVideos();}
}

在我们滑动的时候,jiecaovideoplayer会自动停止正在播放的视频,这里面我还添加了一个功能,就是监听当滑动停止的时候自动播放下一个视频
2、VideoAdapter.java

package la.trytry.jiecaovideoplayer;import android.content.Context;import com.bumptech.glide.Glide;
import com.zhy.adapter.abslistview.CommonAdapter;
import com.zhy.adapter.abslistview.ViewHolder;import java.util.List;import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer;
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard;/*** @author: lijuan* @description: 适配器* @date: 2016-12-04* @time: 17:04*/
public class VideoAdapter extends CommonAdapter<String> {private Context mContext;public VideoAdapter(Context context, List<String> datas, int layoutId) {super(context, layoutId, datas);this.mContext = context;}@Overrideprotected void convert(ViewHolder viewHolder, String url, int position) {JCVideoPlayerStandard player = viewHolder.getView(R.id.player_list_video);if (player != null) {player.release();}boolean setUp = player.setUp(url, JCVideoPlayer.SCREEN_LAYOUT_LIST, "");if (setUp) {Glide.with(mContext).load("http://a4.att.hudong.com/05/71/01300000057455120185716259013.jpg").into(player.thumbImageView);}}
}

这里的适配器,我继承了鸿洋大神写的万能的Adapter,所以我们还需添加这个库的引用

implementation 'com.zhy:base-adapter:3.0.3'

3、item_video.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandardandroid:id="@+id/player_list_video"android:layout_width="match_parent"android:layout_height="190dp" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:paddingBottom="8dp"android:paddingTop="8dp"><ImageViewandroid:id="@+id/img_video_icon"android:layout_width="30dp"android:layout_height="30dp"android:layout_marginLeft="12dp"android:src="@mipmap/icon_default_head" /><TextViewandroid:id="@+id/tv_video_userName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="12dp"android:layout_toRightOf="@id/img_video_icon"android:text="空城旧梦" /><TextViewandroid:id="@+id/tv_video_comment"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="12dp"android:drawablePadding="4dp"android:drawableLeft="@mipmap/icon_comment"android:text="21"android:textSize="12sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginRight="12dp"android:layout_toLeftOf="@id/tv_video_comment"android:text="3万次播放" /></RelativeLayout>
</LinearLayout>

4、activity_video.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" />

下面我们看看最终的效果

这里写图片描述

注:Glide加载Bitmap

Glide不能直接加载Bitmap,需要通过如下方式加载:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] bytes=baos.toByteArray();
Glide.with(MainActivity.this).load(bytes).into(imageView);

参考于:

https://www.jianshu.com/p/34d378bffb00

https://github.com/lipangit/JiaoZiVideoPlayer

https://www.cnblogs.com/guilin-hu/p/5706916.html

https://blog.csdn.net/u011368551/article/details/79927356

安卓视频播放器 仿今日头条视频播放控件----JiaoZiVideoPlayer相关推荐

  1. 仿今日头条视频播放JieCaoVideoPlayer

    原文地址:http://blog.csdn.net/w_l_s/article/details/53132179 JieCaoVideoPlayer一个真正实现Android的全屏功能,立志成为And ...

  2. Android 仿今日头条视频播放器实现(不使用节操哟)

    1.概述 本人经常刷今日头条,里面的视频模块我觉得做的很好,做Android的嘛,看到好的东西就想怎么实现的.头条的那个视频播放器,只能同时播放同一个视频,点击下一个上一个就停止,觉得这功能不错,决定 ...

  3. Android 仿今日头条的视频播放控件(几行代码快速实现)

    前段时间由于项目需要用到类似于今日头条的视频播放器,实现在线播放,边缓存边播放,当然也可以播放本地文件,如下图: 这里我推荐大家使用的是jiecaovideoplayer开源库,这个库的播放引擎是ij ...

  4. Android仿今日头条的开源项目

    起因 看到众多大神纷纷有了自己的开源项目,于是自己琢磨着也想做一个开源项目来学习下,因为每次无聊必刷的app就是今日头条,评论简直比内容都精彩,所以我打算仿今日头条来练练手,期间也曾放弃过,也遇到很多 ...

  5. Android 仿今日头条的开源项目

    前言 看到众多大神纷纷有了自己的开源项目,于是自己琢磨着也想做一个开源项目来学习下,因为每次无聊必刷的 app 就是今日头条,评论简直比内容都精彩,所以我打算仿今日头条来练练手,期间也曾放弃过,也遇到 ...

  6. iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码

    iOS精选源码 控制台开发调试神器GHConsole iOS 高度封装自适应表单(编辑及附件) 基于AVPlayer的视频播放器 仿alibaba分类 Swift 4 - 模仿今日头条 SGBrows ...

  7. Android仿今日头条开源项目

    起因 看到众多大神纷纷有了自己的开源项目,于是自己琢磨着也想做一个开源项目来学习下,因为每次无聊必刷的app就是今日头条,评论简直比内容都精彩,所以我打算仿今日头条来练练手,期间也曾放弃过,也遇到很多 ...

  8. [Android] Android 手机下 仿 今日头条 新闻客户端

    利用一个月的时间,自学了 Android 开发 ,为了检验学习成果,特意 开发了这个  仿 今日头条 新闻客户端 AppNews 包括图文新闻+视频新闻+图片新闻 预览演示如下: 功能说明: 1)底部 ...

  9. Android仿今日头条图片滑动退出效果

    资源下载(2C币) 逛CSDN的时候,看到几篇写仿今日头条图片滑动退出效果的文章,闲着无聊便想着也给自己项目加上,实现的思路有很多种,本着就近原则选了一篇与自己思路相近的文章结合自己的实践总结一下. ...

最新文章

  1. “一百万行Python代码对任何人都足够了”
  2. Redis在Linux上编译
  3. 计算机文化基础教程问什么好难买到,问一个翻译的问题新编计算机文化基础(教程 – 手机爱问...
  4. MSSQL-SQL SERVER 分页原理
  5. JS函数中的arguments
  6. java中document解析jsp,JSP基于dom解析xml实例详解
  7. LeetCode 997. 找到小镇的法官(图的出度和入度)
  8. 百度AI快车道深圳实战班启动,用极致技术打造实用产品
  9. APPLE苹果电子设备模型样机|展示你的专业设计最佳选择
  10. 一个自动上传ip到ftp服务器的bat脚本
  11. POJ 1166 The Clocks (爆搜 || 高斯消元)
  12. python函数可以提高代码执行速度吗_Python代码运行速度慢?这五种方法很管用
  13. 对linux课程的体会和看法,我的linux体会和看法
  14. 在线工具大全 - 推荐
  15. Windows javaw进程占用cpu资源100% 导致电脑卡顿
  16. app下载 微信扫码打开 提示用户用浏览器打开
  17. 假定一种编码的编码范围是a~y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a,aa,aaa,aaaa,aaab,aaac,…,…,b,ba,baa,baaa,b
  18. vue项目中canvas两张图片生成合并成一张图片 canvas二维码放图片上
  19. 安装大淘客出现的两个问题和解决方法
  20. 数学建模对计算机考研有用吗,数学建模有必要参加吗

热门文章

  1. 现货黄金指标精讲(布林通道)
  2. 关于C/C++ 一些自己遇到的问题以及解惑
  3. 零跑股价成绩突出,实现逆风翻盘
  4. openSuse 给i+n双显卡笔记本的分享
  5. opencv 二值化 python_opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用...
  6. 磁生电中的定律及定理
  7. 华为路由器密码恢复方法(含各版本BootROM操作方法)
  8. 漏洞应急响应之批量poc验证
  9. pytorch笔记:torch.sparse类
  10. 显示器从30赫兹升60赫兹_吉赫兹ghz到底是什么意思