153 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Vue
		
	
	
| <template>
 | |
|   <div :id="className" :style="{ width, height }" />
 | |
| </template>
 | |
| 
 | |
| <script setup>
 | |
| import { nextTick, onBeforeUnmount, onMounted, ref, watch } from "vue";
 | |
| import { useDocumentVisibility } from "@vueuse/core";
 | |
| import { uniqueId } from "lodash-es";
 | |
| 
 | |
| let player = null;
 | |
| defineOptions({
 | |
|   name: "AppAliPlayer",
 | |
| });
 | |
| const props = defineProps({
 | |
|   source: { type: [String, Array], default: "" },
 | |
|   vid: { type: String, default: "" },
 | |
|   playAuth: { type: String, default: "" },
 | |
|   cover: { type: String, default: "" },
 | |
|   width: { type: String, default: "100%" },
 | |
|   height: { type: String, default: "600px" },
 | |
|   visible: { type: Boolean, default: false },
 | |
|   autoplay: { type: Boolean, default: true },
 | |
|   showProgress: { type: Boolean, default: true },
 | |
|   isLive: { type: Boolean, default: false },
 | |
|   playTime: { type: Number, default: 0 },
 | |
| });
 | |
| const emits = defineEmits(["ended", "timeupdate"]);
 | |
| const visibility = useDocumentVisibility();
 | |
| const className = ref(uniqueId("_"));
 | |
| onMounted(() => {
 | |
|   watch(
 | |
|     [() => props.source, () => props.vid, () => props.playAuth],
 | |
|     () => {
 | |
|       if (props.source || (props.vid && props.playAuth)) fnCreateAliPlayer();
 | |
|     },
 | |
|     {
 | |
|       immediate: true,
 | |
|     }
 | |
|   );
 | |
|   watch(
 | |
|     () => visibility.value,
 | |
|     () => {
 | |
|       if (visibility.value === "hidden") {
 | |
|         props.visible && pause();
 | |
|       } else {
 | |
|         props.visible && play();
 | |
|       }
 | |
|     },
 | |
|     {
 | |
|       immediate: true,
 | |
|     }
 | |
|   );
 | |
| });
 | |
| const fnCreateAliPlayer = async () => {
 | |
|   await nextTick();
 | |
|   fnDisposeAliPlayer();
 | |
|   const skinLayout = [
 | |
|     { name: "bigPlayButton", align: "blabs", x: 30, y: 80 },
 | |
|     { name: "H5Loading", align: "cc" },
 | |
|     { name: "errorDisplay", align: "tlabs", x: 0, y: 0 },
 | |
|     { name: "infoDisplay" },
 | |
|     { name: "tooltip", align: "blabs", x: 0, y: 56 },
 | |
|     { name: "thumbnail" },
 | |
|     {
 | |
|       name: "controlBar",
 | |
|       align: "blabs",
 | |
|       x: 0,
 | |
|       y: 0,
 | |
|       children: [
 | |
|         { name: "playButton", align: "tl", x: 15, y: 12 },
 | |
|         { name: "timeDisplay", align: "tl", x: 10, y: 7 },
 | |
|         { name: "fullScreenButton", align: "tr", x: 10, y: 12 },
 | |
|         { name: "setting", align: "tr", x: 15, y: 12 },
 | |
|         { name: "volume", align: "tr", x: 5, y: 10 },
 | |
|       ],
 | |
|     },
 | |
|   ];
 | |
|   props.showProgress &&
 | |
|     skinLayout.at(-1).children.unshift({
 | |
|       name: "progress",
 | |
|       align: "blabs",
 | |
|       x: 0,
 | |
|       y: 44,
 | |
|     });
 | |
|   player = new window.Aliplayer(
 | |
|     {
 | |
|       id: className.value,
 | |
|       ...(props.source
 | |
|         ? { source: props.source }
 | |
|         : {
 | |
|             vid: props.vid,
 | |
|             playauth: props.playAuth,
 | |
|             qualitySort: "asc",
 | |
|             format: "m3u8",
 | |
|             encryptType: 1,
 | |
|             mediaType: "video",
 | |
|             isLive: true,
 | |
|             rePlay: false,
 | |
|             playsinline: true,
 | |
|             controlBarVisibility: "hover",
 | |
|           }),
 | |
|       cover: props.cover,
 | |
|       width: props.width,
 | |
|       height: props.height,
 | |
|       autoplay: props.autoplay,
 | |
|       isLive: props.isLive,
 | |
|       useH5Prism: true,
 | |
|       skinLayout,
 | |
|     },
 | |
|     (player) => {
 | |
|       props.autoplay && player.play();
 | |
|       player.on("ended", fnPlayerEnded);
 | |
|       player.on("timeupdate", fnPlayTimeUpdate);
 | |
|       player.seek(props.playTime);
 | |
|     }
 | |
|   );
 | |
| };
 | |
| const fnPlayerEnded = () => {
 | |
|   emits("ended");
 | |
| };
 | |
| const fnPlayTimeUpdate = () => {
 | |
|   emits("timeupdate", player.getCurrentTime());
 | |
| };
 | |
| const fnDisposeAliPlayer = () => {
 | |
|   if (!player) return;
 | |
|   player.dispose();
 | |
|   player = null;
 | |
| };
 | |
| onBeforeUnmount(() => {
 | |
|   fnDisposeAliPlayer();
 | |
| });
 | |
| const play = () => {
 | |
|   player && player.play();
 | |
| };
 | |
| const pause = () => {
 | |
|   player && player.pause();
 | |
| };
 | |
| defineExpose({
 | |
|   play,
 | |
|   pause,
 | |
| });
 | |
| </script>
 | |
| 
 | |
| <style scoped lang="scss">
 | |
| :deep {
 | |
|   .prism-setting-speed,
 | |
|   .prism-setting-cc,
 | |
|   .prism-setting-audio {
 | |
|     display: none;
 | |
|   }
 | |
| }
 | |
| </style>
 |