视频播放预加载java_Android 视频播放器JieCaoVideoPlayer使用(防今日头条视频预加载)...

本文介绍了在Android中使用JieCaoVideoPlayer实现视频播放预加载,防止今日头条式的滑动自动播放。文章详细讲解了依赖引入、AndroidManifest配置、获取视频第一帧作为缩略图的方法,以及在ListView中应用的适配器和滑动监听,确保视频在正确位置时才开始播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上代码

依赖

compile 'fm.jiecao:jiecaovideoplayer:4.8.3'

compile 'com.github.bumptech.glide:glide:3.7.0'

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

注意的是在AndroidManifest.xml添加

android:configChanges=“keyboardHidden|orientation|screenSize”

懂得都懂在横竖屏切换时保存状态不然切换横屏的时候会出现黑屏现象

android:configChanges="keyboardHidden|orientation|screenSize">

在根目录添加

b_0_202011291901051454.png

布局添加

android:id="@+id/player_list_video"

android:layout_width="match_parent"

android:layout_height="220dp"

tools:ignore="MissingConstraints" />

在Activity里面添加监听我们返回停止视频

@Override

public void onBackPressed() {

if (JCVideoPlayer.backPress()) {

return;

}

super.onBackPressed();

}

@Override

protected void onPause() {

super.onPause();

JCVideoPlayer.releaseAllVideos();

}

然后我们需要获取视频的第一帧作为视频的缩略图

public static Bitmap getNetVideoBitmap(String videoUrl) {

Bitmap bitmap = null;

MediaMetadataRetriever retriever = new MediaMetadataRetriever();

try {

//根据url获取缩略图

retriever.setDataSource(videoUrl, new HashMap());

//获得第一帧图片

bitmap = retriever.getFrameAtTime();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} finally {

retriever.release();

}

return bitmap;

}

接下来就是播放视频了

String videoUrl="http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4";

JCVideoPlayerStandard player = (JCVideoPlayerStandard) findViewById(R.id.player_list_video);

player.setUp(videoUrl, JCVideoPlayer.SCREEN_LAYOUT_LIST, "");

Bitmap bitmap = getNetVideoBitmap(videoUrl);

player.thumbImageView.setImageBitmap(bitmap);//对应的ImageView赋值图片一定要用thumbImageView才能获取设置上

b95356f1a791fa4d348baf93ce1d9687.png

然后就是防今日头条视频然后滑动自动播放

适配器

public class VideoAdapter extends CommonAdapter {

private Context mContext;

private String videoUrl="http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4";

private Bitmap bitmap;

private MediaMetadataRetriever retriever;

public VideoAdapter(Context context, List datas, int layoutId) {

super(context, layoutId, datas);

this.mContext = context;

}

@Override

protected 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, "");

/* retriever = new MediaMetadataRetriever(); //获取视频第一帧图片有真实接口后可进行遍历获取暂时定死

//根据url获取缩略图

retriever.setDataSource(videoUrl, new HashMap());

//获得第一帧图片

bitmap = retriever.getFrameAtTime();

player.thumbImageView.setImageBitmap(bitmap);//对应的ImageView赋值图片*/

// Glide.with(mContext).load(videoUrl).into(player.thumbImageView);

if (setUp) {

Glide.with(mContext).load("http://a4.att.hudong.com/05/71/01300000057455120185716259013.jpg").into(player.thumbImageView);

}

}

}

适配器布局

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/player_list_video"

android:layout_width="match_parent"

android:layout_height="190dp" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:paddingBottom="8dp"

android:paddingTop="8dp">

android:id="@+id/img_video_icon"

android:layout_width="30dp"

android:layout_height="30dp"

android:layout_marginLeft="12dp"

android:src="@drawable/ic_launcher_background" />

android: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="空城旧梦" />

android: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:text="👍21"

android:textSize="12sp" />

android: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万次播放" />

Activity代码与布局

public class MainActivity2 extends AppCompatActivity {

private String videoUrl = "http://gslb.miaopai.com/stream/ed5HCfnhovu3tyIQAiv60Q__.mp4";

private ListView listView;

private ArrayList datas;

private JCVideoPlayerStandard currPlayer;

private VideoAdapter adapter;

private AbsListView.OnScrollListener onScrollListener;

private int firstVisible;//当前第一个可见的item

private int visibleCount;//当前可见的item个数

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main2);

listView = (ListView) findViewById(R.id.listview);

initDatas();

initListener();

}

private void initDatas() {

datas = new ArrayList();

for (int i = 0; i < 20; i++) {

datas.add(videoUrl);

}

adapter = new VideoAdapter(MainActivity2.this, datas, R.layout.item_video);

listView.setAdapter(adapter);

}

/**

* 滑动监听

*/

private void initListener() {

onScrollListener = new AbsListView.OnScrollListener() {

@Override

public 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;

}

}

@Override

public 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();

}

@Override

public void onBackPressed() {

if (JCVideoPlayer.backPress()) {

return;

}

super.onBackPressed();

}

@Override

protected void onPause() {

super.onPause();

JCVideoPlayer.releaseAllVideos();

}

}

android:id="@+id/listview"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" />

不要忘记在res添加xml文件夹创建network_security_config.xml

然后把 android:networkSecurityConfig="@xml/network_security_config"放到AndroidManifest的里面

9667f8688d8149b392e3a647f80edd97.png

本文地址:https://blog.youkuaiyun.com/qq_42609613/article/details/110227580

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值