Android 仿今日頭條的視頻播放控件(幾行代碼快速實現)


前段時間由於項目需要用到類似於今日頭條的視頻播放器,實現在線播放,邊緩存邊播放,當然也可以播放本地文件,如下圖:
這裏寫圖片描述
這裏我推薦大家使用的是jiecaovideoplayer開源庫,這個庫的播放引擎是ijkplayer,它調用ffmpeg, 原項目GitHub地址:https://github.com/lipangit/JieCaoVideoPlayer
一、項目引入:
1、添加類庫

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

2、添加布局

 <fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard
        android: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中

@Override
    public void onBackPressed() {
        if (JCVideoPlayer.backPress()) {
            return;
        }
        super.onBackPressed();
    }

    @Override
    protected 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;

    @Override
    protected 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();
    }

    @Override
    public void onBackPressed() {
        if (JCVideoPlayer.backPress()) {
            return;
        }
        super.onBackPressed();
    }

    @Override
    protected 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;//當前第一個可見的item
        private int visibleCount;//當前可見的item個數
    
        @Override
        protected 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() {
                @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();
        }
    }

    在我們滑動的時候,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;
        }
    
        @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, "");
            if (setUp) {
                Glide.with(mContext).load("http://a4.att.hudong.com/05/71/01300000057455120185716259013.jpg").into(player.thumbImageView);
            }
        }
    }

    這裏的適配器,我繼承了鴻洋大神寫的萬能的Adapter,所以我們還需添加這個庫的引用

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

    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.JCVideoPlayerStandard
            android:id="@+id/player_list_video"
            android:layout_width="match_parent"
            android:layout_height="190dp" />
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="8dp"
            android:paddingTop="8dp">
    
            <ImageView
                android:id="@+id/img_video_icon"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_marginLeft="12dp"
                android:src="@mipmap/icon_default_head" />
    
            <TextView
                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="空城舊夢" />
    
            <TextView
                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:drawableLeft="@mipmap/icon_comment"
                android:text="21"
                android:textSize="12sp" />
    
            <TextView
                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萬次播放" />
        </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" />
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    下面我們看看最終的效果
    這裏寫圖片描述
    好了,本篇文章已經全部寫完但是當在fragment中加載視屏時無法全屏播放,不知道爲啥

    發佈了55 篇原創文章 · 獲贊 38 · 訪問量 7萬+
    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章