国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Android入門到項目實戰(zhàn)-- 11.4】—— ExoPlayer視頻播放器框架的詳細使用

這篇具有很好參考價值的文章主要介紹了【Android入門到項目實戰(zhàn)-- 11.4】—— ExoPlayer視頻播放器框架的詳細使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

什么是ExoPlayer

一、基本使用

?1、添加依賴項

?2、布局

3、Activity

二、自定義播放暫停

1、首先如何隱藏默認的開始暫停和快進?

2、自定義

三、控制視頻畫面旋轉(zhuǎn)和比例調(diào)整

四、全屏放大和縮小

1、雙擊視頻放大縮小

2、按鈕放大縮小

五、完整的實現(xiàn)代碼

XML

Activity


什么是ExoPlayer

????????ExoPlayer是由Google開發(fā)的媒體播放器庫,支持播放本地和網(wǎng)絡視頻。以下是使用ExoPlayer播放視頻的詳細步驟和代碼示例。

一、基本使用

????????下面實現(xiàn)如下圖所示的兩個播放器的效果:

【Android入門到項目實戰(zhàn)-- 11.4】—— ExoPlayer視頻播放器框架的詳細使用

?1、添加依賴項

build.gradle添加:

implementation 'com.google.android.exoplayer:exoplayer-core:2.15.1'  
implementation 'com.google.android.exoplayer:exoplayer-ui:2.15.1' 

聲明網(wǎng)絡權限

    <uses-permission android:name="android.permission.INTERNET" />

?2、布局

<?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="match_parent"
    android:orientation="vertical">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/player_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>


    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/player_view2"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"/>


</LinearLayout>

3、Activity

public class MainActivity extends AppCompatActivity {
    private SimpleExoPlayer mPlayer;
    private SimpleExoPlayer mPlayer2;
    private PlayerView mPlayerView;
    private PlayerView mPlayerView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPlayerView = findViewById(R.id.player_view);
        mPlayerView2 = findViewById(R.id.player_view2);

        // 創(chuàng)建媒體播放器
        mPlayer = new SimpleExoPlayer.Builder(this).build();
        mPlayer2 = new SimpleExoPlayer.Builder(this).build();
        mPlayerView.setPlayer(mPlayer);
        mPlayerView2.setPlayer(mPlayer2);


        // 設置數(shù)據(jù)源
        String videoUrl = "https://v2.kwaicdn.com/upic/2023/04/14/13/BMjAyMzA0MTQxMzA3MDhfNDgwOTQ5MTg2XzEwMDU1NzkwNjgxMV8yXzM=_b_B4856a8b07ea4dbc4ad503f04681b5ec8.mp4?pkey=AAW-JkY6q-BoTEXl2FArO1ReMGt965IaFcPl0NGX7cYTVhLtgZVdld15RtYUAWwkkEmBjjKBPE2yDFb0kigIji2xGTYcxXU-rCTrXNQiN4N4_RpUja5SPyx99Eh46Cixcag&tag=1-1684724589-unknown-0-0eoiahcqin-0a0841bce7d498e5&clientCacheKey=3xt93xmd7emzv6k_b.mp4";
        String videoUrl2 = "https://v2.kwaicdn.com/upic/2023/05/20/16/BMjAyMzA1MjAxNjAyMjhfMTM2MDg5NzAyNl8xMDM1MjIwNDgzMjFfMl8z_b_B0d97abd06757be9906cd83e0571dcd7d.mp4?pkey=AAX4DgH_Q4KBjVVQpeITMyNxi34_0KOD7Dp80qxpwuNV4BfONaasSnAkBrFPEdGKbfj0m9Jd_VGG-isTQxiQGOlUQ6e2OKuPO2f72pFUVdxdEJkqCVpijL4zsJu3mMtoBfc&tag=1-1684724589-unknown-0-hilddj6arr-772b90a0f590e795&clientCacheKey=3xhd9ng5fbii652_b.mp4";
        MediaItem mediaItem = MediaItem.fromUri(videoUrl);
        MediaItem mediaItem2 = MediaItem.fromUri(videoUrl2);
        mPlayer.setMediaItem(mediaItem);
        mPlayer2.setMediaItem(mediaItem2);
        mPlayer.prepare();
        mPlayer2.prepare();


    }

//        以下是生命周期管理
    @Override
    protected void onStart() {
        super.onStart();
        mPlayerView.onResume();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mPlayerView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPlayer.release();
    }

//        注意:在使用ExoPlayer時,需要在Activity中保持屏幕常亮以避免視頻播放過程中屏幕自動關閉。
    @Override
    protected void onResume() {
        super.onResume();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    @Override
    protected void onPause() {
        super.onPause();
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}

二、自定義播放暫停

1、首先如何隱藏默認的開始暫停和快進?

????????隱藏它們很簡單,只需把use_controller設置成false即可。

<com.google.android.exoplayer2.ui.StyledPlayerView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        app:use_controller="false"/>

2、自定義

????????ExoPlayer還提供了很多控制視頻播放的API,如暫停、繼續(xù)、快進、快退、調(diào)整音量、調(diào)整亮度等。下面將介紹如何實現(xiàn)視頻的暫停和繼續(xù)播放。

????????在Activity中添加下面的代碼:

private boolean isPlaying = false;

private void togglePlay() {
    if (isPlaying) {
        player.pause();
    } else {
        player.play();
    }
    isPlaying = !isPlaying;
}

????????利用isPlaying布爾變量記錄當前視頻的播放狀態(tài),使用player.pause()方法暫停視頻,使用player.play()方法繼續(xù)播放視頻,并且通過isPlaying變量更新當前播放狀態(tài)。

????????在SimpleExoPlayerView中添加點擊事件:

playerView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        togglePlay();
    }
});

這樣就可以實現(xiàn)通過點擊視頻區(qū)域來暫停和繼續(xù)視頻的播放。????????

三、控制視頻畫面旋轉(zhuǎn)和比例調(diào)整

????????xoPlayer支持旋轉(zhuǎn)視頻畫面和調(diào)整視頻比例的功能。下面將介紹如何使用ExoPlayer來實現(xiàn)這些功能。

????????使用代碼旋轉(zhuǎn)視頻畫面,可以調(diào)用SimpleExoPlayerView.setUseController(false)方法隱藏內(nèi)置的控制器,然后利用下面的代碼實現(xiàn)視頻旋轉(zhuǎn):

playerView.setKeepScreenOn(true);
playerView.setRotation(90);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);

????????通過playerView.setKeepScreenOn(true)方法保持屏幕常亮,playerView.setRotation(90)方法實現(xiàn)視頻的旋轉(zhuǎn),playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT)方法調(diào)整視頻的比例。

四、全屏放大和縮小

????????實現(xiàn)視頻畫面的縮放,可以通過以下代碼實現(xiàn):

private boolean isFullscreen = false;

private void toggleFullscreen() {
    if (isFullscreen) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
        getSupportActionBar().show();
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
        getSupportActionBar().hide();
    }
    isFullscreen = !isFullscreen;
}

????????利用isFullscreen布爾變量記錄當前是否全屏狀態(tài),使用setRequestedOrientation()方法實現(xiàn)屏幕的旋轉(zhuǎn),使用getWindow().addFlags()和getWindow().clearFlags()方法實現(xiàn)全屏狀態(tài)的切換,并且使用playerView.setResizeMode()方法調(diào)整視頻的比例。在全屏狀態(tài)下隱藏ActionBar,退出全屏狀態(tài)后顯示ActionBar。

1、雙擊視頻放大縮小

????????在SimpleExoPlayerView中添加雙擊事件:

playerView.setOnTouchListener(new View.OnTouchListener() {
    private GestureDetector gestureDetector = new GestureDetector(MainActivity.this,
            new GestureDetector.SimpleOnGestureListener() {
                @Override
                public boolean onDoubleTap(MotionEvent e) {
                    toggleFullscreen();
                    return super.onDoubleTap(e);
                }
            });

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        gestureDetector.onTouchEvent(motionEvent);
        return true;
    }
});

????????這樣就可以實現(xiàn)在雙擊視頻區(qū)域時切換視頻的全屏狀態(tài)。

2、按鈕放大縮小

        mBtnZoom.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toggleFullscreen();
            }
       });

五、完整的實現(xiàn)代碼

??????? 如果看不懂前面的操作,可以直接用下面的代碼,有點擊按鈕和雙擊視頻全屏放大縮小效果。

XML

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

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/player_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_zoom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_margin="16dp"
        android:backgroundTint="@color/white"
        android:text="Full Screen"
        android:textColor="@color/black"
        android:visibility="visible"
        android:onClick="onFullscreenButtonClick"/>


</RelativeLayout>

Activity

public class MainActivity extends AppCompatActivity {
    private SimpleExoPlayer mPlayer;
    private PlayerView mPlayerView;
    private Button mBtnZoom;
    private boolean isFullscreen = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mPlayerView = findViewById(R.id.player_view);
        mBtnZoom = findViewById(R.id.btn_zoom);

//         創(chuàng)建媒體播放器
        mPlayer = new SimpleExoPlayer.Builder(this).build();
        mPlayerView.setPlayer(mPlayer);

//        準備視頻源
        String videoUrl = "https://v2.kwaicdn.com/upic/2023/04/14/13/BMjAyMzA0MTQxMzA3MDhfNDgwOTQ5MTg2XzEwMDU1NzkwNjgxMV8yXzM=_b_B4856a8b07ea4dbc4ad503f04681b5ec8.mp4?pkey=AAW-JkY6q-BoTEXl2FArO1ReMGt965IaFcPl0NGX7cYTVhLtgZVdld15RtYUAWwkkEmBjjKBPE2yDFb0kigIji2xGTYcxXU-rCTrXNQiN4N4_RpUja5SPyx99Eh46Cixcag&tag=1-1684724589-unknown-0-0eoiahcqin-0a0841bce7d498e5&clientCacheKey=3xt93xmd7emzv6k_b.mp4";
        String videoUrl2 = "https://v2.kwaicdn.com/upic/2023/05/20/16/BMjAyMzA1MjAxNjAyMjhfMTM2MDg5NzAyNl8xMDM1MjIwNDgzMjFfMl8z_b_B0d97abd06757be9906cd83e0571dcd7d.mp4?pkey=AAX4DgH_Q4KBjVVQpeITMyNxi34_0KOD7Dp80qxpwuNV4BfONaasSnAkBrFPEdGKbfj0m9Jd_VGG-isTQxiQGOlUQ6e2OKuPO2f72pFUVdxdEJkqCVpijL4zsJu3mMtoBfc&tag=1-1684724589-unknown-0-hilddj6arr-772b90a0f590e795&clientCacheKey=3xhd9ng5fbii652_b.mp4";
        MediaItem mediaItem = MediaItem.fromUri(videoUrl);
        MediaItem mediaItem2 = MediaItem.fromUri(videoUrl2);
        mPlayer.setMediaItem(mediaItem);
        mPlayer.prepare();


//        按鈕放大縮小
        mBtnZoom.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toggleFullscreen();
            }
        });


//        雙擊視頻放大縮小
        mPlayerView.setOnTouchListener(new View.OnTouchListener() {
            private GestureDetector gestureDetector = new GestureDetector(MainActivity.this,
                    new GestureDetector.SimpleOnGestureListener() {
                        @Override
                        public boolean onDoubleTap(MotionEvent e) {
                            toggleFullscreen();
                            return super.onDoubleTap(e);
                        }
                    });

            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                gestureDetector.onTouchEvent(motionEvent);
                return true;
            }
        });


    }



//    視頻放大縮小方法
    private void toggleFullscreen() {
        if (isFullscreen) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            mPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
            getSupportActionBar().show();
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            mPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
            getSupportActionBar().hide();
        }
        isFullscreen = !isFullscreen;
    }


//    以下是生命周期
    @Override
    protected void onStart() {
        super.onStart();
        mPlayerView.onResume();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mPlayerView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPlayer.release();
    }


//    注意:在使用ExoP注意:在使用ExoPlayer時,需要在Activity中保持屏幕常亮以避免視頻播放過程中屏幕自動關閉。layer時,需要在Activity中保持屏幕常亮以避免視頻播放過程中屏幕自動關閉。
    @Override
    protected void onResume() {
        super.onResume();
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    @Override
    protected void onPause() {
        super.onPause();
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}

最后不要忘記添加網(wǎng)絡權限!文章來源地址http://www.zghlxwxcb.cn/news/detail-509067.html

到了這里,關于【Android入門到項目實戰(zhàn)-- 11.4】—— ExoPlayer視頻播放器框架的詳細使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Android 播放視頻之ExoPlayer

    Android 播放視頻之ExoPlayer

    在上一篇中,我們了解了系統(tǒng)自帶的 VideoView 來播放視頻,但其支持的視頻格式偏少,我們需要其他的視頻播放器。 ExoPlayer 是Google的開源的應用級媒體播放器項目,支持多種視頻格式和流媒體播放,GitHub地址。 導入 ExoPlayer 在布局文件里添加 StyledPlayerView 在 Activity 里面播放

    2024年02月15日
    瀏覽(21)
  • 深入理解Android音視頻同步機制(一)ExoPlayer的avsync邏輯

    深入理解Android音視頻同步機制(一)ExoPlayer的avsync邏輯

    對于此前沒有了解過ExoPlayer的朋友,我們在這里先用下面的時序圖簡單介紹一下ExoPlayer在音視頻同步這塊的基本流程: 圖中 ExoPlayerImplInternal是Exoplayer的主loop所在處,這個大loop不停的循環(huán)運轉(zhuǎn),將下載、解封裝的數(shù)據(jù)送給AudioTrack和MediaCodec去播放。 MediaCodecAudioRenderer和MediaC

    2023年04月12日
    瀏覽(20)
  • Android ExoPlayer2播放m3u8視頻設置Cookie

    支持m3u8格式視頻,同時服務端做了加密防止視頻被盜。 服務端需要客戶端這邊再請求.m3u8地址時帶上3個Cookie參數(shù),分別是CloudFront-Policy,CloudFront-Signature,CloudFront-Key-Pair-Id。 本地使用了GSYVideoPlayer作為視頻播放器,如何設置Cookie是個問題,原本以為直接將待傳入的三個Cookie直接

    2024年01月16日
    瀏覽(39)
  • 安卓的播放器對比與選型(vlc,EXOplayer,Ijkplayer,GSYVideoPlayer)詳細過程

    安卓的播放器對比與選型(vlc,EXOplayer,Ijkplayer,GSYVideoPlayer)詳細過程

    本文主要從實際的角度去解讀和選型 入職新公司,需要做一款涉及到播放器,播放rtsp 流的app,要求到我來選型,并給了我下面三個選擇 在這之前我只是一名普普通通的安卓應用開發(fā)工程師,沒有接觸過音視頻,如果你也和我一樣,那么這件事真的太酷啦?? 然后就是為期幾

    2024年02月15日
    瀏覽(21)
  • Android 使用ViewPager2+ExoPlayer+VideoCache 實現(xiàn)仿抖音視頻翻頁播放

    Android 使用ViewPager2+ExoPlayer+VideoCache 實現(xiàn)仿抖音視頻翻頁播放

    1. 實現(xiàn)效果 ? ?效果圖中,視頻沒有鋪滿 是因為使用了ExoPlayer的RESIZE_MODE_FIT模式, 雖然使用RESIZE_MODE_FILL模式可以填充整個父布局,但是本Demo中使用的視頻源本身就不適合全屏,會把視頻拉伸,效果不好。 抖音上的視頻源應該都有嚴格的寬高尺寸,才能做到全屏有很好的效

    2023年04月09日
    瀏覽(66)
  • 移動端開源播放器對比與選型(ExoPlayer/ijkplayer/VLC/GStreamer/SmarterPlayer)

    ExoPlayer 是 Google 推出的開源播放器,主要是集成了Android 提供的一套解碼系統(tǒng)來解析視頻和音頻,將 MediaCodec 封裝地非常完善,并加入了對 DASH 和 HLS 等直播協(xié)議的支持,形成了一個性能優(yōu)越,播放穩(wěn)定性較好的一個開發(fā)播放器。 Github : https://github.com/google/ExoPlayer star fork iss

    2024年02月08日
    瀏覽(25)
  • Android開發(fā)之視頻播放器

    Android開發(fā)之視頻播放器

    今天教大家做一個簡單的視頻播放器hh 至此,結(jié)束!

    2023年04月09日
    瀏覽(29)
  • Android學習6——視頻播放器

    Android學習6——視頻播放器

    一、學習目標 1. 綜合應用課程知識。 2. 掌握 App 開發(fā)流程及相關工具。 3. 設計 一個基于 Android 平臺的簡單視頻播放器。 二、環(huán)境 1.JDK-15.0.2 以上 2.Android Studio 4.1 以上 3.Android 10.0 ( API level 29 ) 三、內(nèi)容 軟件功能簡介 (1) 能夠播放 3gp, .mp4 等文件; (2) 能處理簡單的異常,例

    2024年02月01日
    瀏覽(23)
  • Android 視頻播放器dkplayer

    Android 視頻播放器dkplayer

    gihub地址 : https://github.com/Doikki/DKVideoPlayer GitHub - Doikki/DKVideoPlayer: Android Video Player. 安卓視頻播放器,封裝MediaPlayer、ExoPlayer、IjkPlayer。模仿抖音并實現(xiàn)預加載,列表播放,懸浮播放,廣告播放,彈幕,視頻水印,視頻濾鏡 列表播放如圖所示: 一、依賴 二、工具類 Tag.java Vi

    2024年02月13日
    瀏覽(26)
  • Python入門教程+項目實戰(zhàn)-11.5節(jié): 程序?qū)崙?zhàn)-選擇排序算法

    Python入門教程+項目實戰(zhàn)-11.5節(jié): 程序?qū)崙?zhàn)-選擇排序算法

    目錄 11.5.1?排序算法簡介 11.5.2?選擇排序算法 11.5.3 系統(tǒng)學習python 所謂排序,是指將數(shù)據(jù)集合中的元素按從小到大的順序進行排列,或按從大到小的順序進行排列。前者稱為升序排序,后者稱為降序排序。在數(shù)據(jù)結(jié)構與算法這門課程中,我們會學習到諸多與排序相關的算法,

    2024年02月02日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包