[Xgplayer] xgplayer カスタム スクリーン キャプチャ ボタン | xgplayer スクリーン キャプチャ機能 | xgplayer スクリーン キャプチャ トリガー | xgplayer スクリーン キャプチャ方法 | vue3 は xgplayer を使用します

Xgplayer イベントリファレンス


必要

  1. カスタムスクリーンショットボタン
  2. ボタンをクリックしてスクリーンショットを撮り画像アドレスを取得し画像をプレビューします。
  3. 現在のスクリーンショットの時間を取得します
  4. プログレスバーをドラッグすると、リアルタイムでスクリーンショットが撮影されます(手ぶれ補正が必要です)

最終レンダリングの表示

  • スクリーンショットを撮って画像をプレビューし、現在のスクリーンショット時間を表示します
    ここに画像の説明を挿入


1.手ぶれ補正

src/utils/tuils.js

// 防抖函数| f 要执行的函数 | deley 延时(毫秒),默认100 | firstRun 第一次是否执行 true就是执行,默认false, // // // // // // // // // // // // // 
function debounce(f, deley = 100, firstRun = false) {
    
    
    let time666
    // 第一次是否执行
    if (firstRun === true) f();

    return (_, ...arg) => {
    
    
        clearTimeout(time666)
        time666 = setTimeout(__ => f.call(_, arg), deley)
    }
};


export {
    
    
    debounce
}

2. 手ぶれ補正 + スクリーンキャプチャボタン + 基本設定(サブレベル)をインポート

一連の考え

  1. スクリーンショットコントロールをオンにする
  2. スクリーンショットメソッドを呼び出す
  • コードに集中する

src/components/PlayerVideo.vue

<template>
    <!-- 1. 播放器占位,注意id -->
    <div id="player"></div>
</template>

<script setup>
// 引入相关
import {
      
       onMounted, reactive } from 'vue';

import Player from 'xgplayer/dist/simple_player';
import screenShot from 'xgplayer/dist/controls/screenShot';//截屏

// 2. 导入防抖功能
import {
      
       debounce } from '@/utils/utils';

// 3. 定义一个emit | setVideoCurTimeAndSceShop - 视频进度条改变触发,更新时间与截屏
const emit = defineEmits(['setVideoCurTimeAndSceShop']);

// 4. 配置
const playerOpts = {
      
      
    hideScroll: true,//是否隐藏截屏按钮 - 自定义 (* 重点),如尾部css
    id: 'player',//元素id
    url: '/public/video/4.mp4',//视频地址 

    //截图配置///
    // 值 - 默认false,不启用截屏 || 对象{}
    // 配置类型1 //
    // screenShot:false,
    // 配置类型2 //
    screenShot: {
      
      
        saveImg: false,//截屏后是否下载
        quality: .92,//图片质量,感觉没啥用
        type: 'image/png',//图片格式 
        format: '.png'
    },

    // 5. 菜单
    controlPlugins: [
        // 因为想调用截屏功能,必须启用截屏按钮
        // 该按钮我已通过css隐藏,如尾部css所示
        screenShot,//显示截屏按钮
    ],

};

// 6. //播放器
let player = null;

// 7.  页面元素渲染后,onMounted里实例xgplayer
onMounted(() => {
      
      
    // 8.  实例xgplaye ,并加载playerOpts配置
    player = new Player(playerOpts)

    // 视频加载完毕
    player.once('ready', () => {
      
      
        // 9.  监听截屏事件
        // ↓↓↓↓↓↓↓↓↓↓事件参考地址 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        // https://v2.h5player.bytedance.com/api/#%E4%BA%8B%E4%BB%B6
        // 监听screenShot截屏事件,截屏后触发该函数 
        player.on('screenShot', function (imgSrc) {
      
      
            const emitVideoInfo = {
      
      
                time: player.currentTime,
                imgSrc: imgSrc, // 截屏后返回base64图片地址,直接放img的src即可渲染 
            }
            emit('setVideoCurTimeAndSceShop', emitVideoInfo)
        })

        //  10. 视频进度条改变 - 拖动进度条实时截屏+时间
        // 视频进度条改变(防抖)
        player.on('seeked', debounce(myScreenShopt, 100, false));
    })
})

// 11.  截屏函数
// 截屏需用【player.playerVideo.emit('screenShotBtnClick')】触发 
// 为了方便父级调用,疯装成函数
function myScreenShopt() {
      
      
    player.emit('screenShotBtnClick')
}

// 12. 共享截屏方法,便于父级调用 
defineExpose({
      
      
    myScreenShopt: myScreenShopt,//共享截屏函数
})
</script>
 
<style scoped>
#player {
      
      
    width: 100%;
}

#player>>>.hide {
      
      
    visibility: hidden;
}

/* 绑定playerOpts.hideScroll - 隐藏|显示截屏按钮 */
#player>>>.xgplayer-screenshot {
      
      
    display: v-bind('playerOpts.hideScroll === true ? "none" : "block"');
}
</style>


2. スクリーンショット(親)を使用する

src/views/VideoView.vue

<template>
    <!-- 
    1. 使用xgplayer视频组件 
    ref="video" 重点这里,通过ref取到xgplayer实例与截屏函数
    setVideoCurTimeAndSceShop 获取截屏|时间方法
    videoBar.getVideoInfo => 拖动视频进度条,实时截屏 + 时间
	-->
    <video-player ref="video" @setVideoCurTimeAndSceShop="videoBar.getVideoInfo" />

    <!--  2. 点击按钮截屏 -->
    <button @click="videoBar.videoInfo.myScreenShopt()">截屏</button>

    <!-- 3. 时间-->
    <p> 当前时间: {
   
   { videoBar.videoInfo.time }} </p>

    <!-- 4. 图片-->
    <img :src="videoBar.videoInfo.imgSrc" style="width: 100%;object-fit: cover;">

    <!-- 
  、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
   、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
   装有很多很多html代码
    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
     、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
      、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
	-->
</template>

<script setup>
import {
      
       reactive, ref, onMounted } from 'vue';

// 5. 导入格式化时间工具
import {
      
       format } from 'xgplayer/src/utils/util';

// 6. 通过ref获取视频组件
const video = ref(null);

// 7. 相关配置
const videoBar = reactive({
      
      
    // 播放器信息
    videoInfo: {
      
      
        time: '',//时间 ,已格式化 
        imgSrc: '',// 图片地址
        myScreenShopt: null,//截屏方法
    },

    // 8. 截屏方法
    getVideoInfo(info) {
      
      
        videoBar.videoInfo.imgSrc = info.imgSrc;
        videoBar.videoInfo.time = format(info.time);
    },
})

onMounted(() => {
      
      
    // 组件渲染完成后,加载截屏方法
    videoBar.videoInfo.myScreenShopt = video.value.myScreenShopt;
});
</script> 

最終的なエフェクト表示

  • これで完了です。進行状況バーをどこにドラッグするか

1

ここに画像の説明を挿入



2

ここに画像の説明を挿入



3

ここに画像の説明を挿入



当時の香港のスターには美貌と優れた演技力が必要だったと言わざるを得ません。


終わり

2023/3/9 00:53 シリーズ


2023/3/9 10:49 変更


2023/3/9 16:50 第二交代


2023/3/9 23:08 3つの変化


2023/3/10 10:54 4つの変更


2023/3/11 10:15 五変化


お勧め

  1. [Xgplayer] xgplayer の基本的な使い方 & xgplayer の使い方 & 超素晴らしいフロントエンド ビデオ プレーヤー && xgplayer の最高のフロントエンド ビデオ プレーヤー

  2. [xgplayer] xgplayer のピット充填 && xgplayer のフルスクリーンが CSS フルスクリーンと競合します

おすすめ

転載: blog.csdn.net/qq_43614372/article/details/129414296