160 lines
5.9 KiB
Vue
160 lines
5.9 KiB
Vue
![]() |
<template>
|
|||
|
<div class="mt-2" id="myVid">
|
|||
|
<!-- video element -->
|
|||
|
<!-- <vue-plyr :options="options">
|
|||
|
<video controls crossorigin playsinline data-poster="poster.jpg">
|
|||
|
<source size="720" src="/path/to/video-720p.mp4" type="video/mp4" />
|
|||
|
<source size="1080" src="/path/to/video-1080p.mp4" type="video/mp4" />
|
|||
|
<track
|
|||
|
default
|
|||
|
kind="captions"
|
|||
|
label="English captions"
|
|||
|
src="/path/to/english.vtt"
|
|||
|
srclang="en"
|
|||
|
/>
|
|||
|
</video>
|
|||
|
</vue-plyr> -->
|
|||
|
|
|||
|
<!-- audio element -->
|
|||
|
<vue-plyr ref="plyr" :options="options">
|
|||
|
<video v-if="type == 'video'" controls crossorigin playsinline>
|
|||
|
<source
|
|||
|
size="720"
|
|||
|
:src="file.attachment.url"
|
|||
|
:type="'video/' + file.attachment.ext"
|
|||
|
/>
|
|||
|
</video>
|
|||
|
|
|||
|
<audio v-else controls crossorigin playsinline data-poster="poster.jpg">
|
|||
|
<source
|
|||
|
:src="file.attachment.url"
|
|||
|
:type="'audio/' + file.attachment.ext"
|
|||
|
/>
|
|||
|
</audio>
|
|||
|
</vue-plyr>
|
|||
|
<p class="my-2">
|
|||
|
{{ file.attachment.name }}
|
|||
|
</p>
|
|||
|
<p class="my-2">
|
|||
|
{{ formatBytes(file.attachment.length) }}
|
|||
|
</p>
|
|||
|
</div>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
/**
|
|||
|
* @vue-prop {String} [type] - نوع فایل
|
|||
|
* @vue-prop {Object} [file] - فایل
|
|||
|
*
|
|||
|
* @vue-data {undefined} [canvas=undefined] - یک محیط توسعه وب برای رسم شکلها، تصاویر، ویدیوها و سایر عناصر گرافیکی است.
|
|||
|
* @vue-data {Object} [options] - گزینههای ویدیو پلیر
|
|||
|
* @vue-data {Array} [options.controls] - کنترلهای ویدیو پلیر
|
|||
|
* @vue-data {Array} [options.controls=["play", "progress", "current-time", "mute", "volume", "settings", "download"]] - کنترلهای ویدیو پلیر (پخش، پیشرفت، زمان فعلی، بیصدا، میزان صدا، تنظیمات، دانلود)
|
|||
|
* @vue-data {Object} [options.speed] - سرعت پخش ویدیو
|
|||
|
* @vue-data {Number} [options.speed.selected=1] - سرعت پخش انتخاب شده
|
|||
|
* @vue-data {Array} [options.speed.options=[0.75, 1, 1.5, 2]] - گزینههای سرعت پخش ویدیو
|
|||
|
*/
|
|||
|
|
|||
|
export default {
|
|||
|
props: ["type", "file"],
|
|||
|
data() {
|
|||
|
return {
|
|||
|
canvas: undefined,
|
|||
|
options: {
|
|||
|
controls: [
|
|||
|
// "play-large", // The large play button in the center
|
|||
|
//'restart', // Restart playback
|
|||
|
// "rewind", // Rewind by the seek time (default 10 seconds)
|
|||
|
"play", // Play/pause playback
|
|||
|
// "fast-forward", // Fast forward by the seek time (default 10 seconds)
|
|||
|
"progress", // The progress bar and scrubber for playback and buffering
|
|||
|
"current-time", // The current time of playback
|
|||
|
// "duration", // The full duration of the media
|
|||
|
"mute", // Toggle mute
|
|||
|
"volume", // Volume control
|
|||
|
// "captions", // Toggle captions
|
|||
|
"settings", // Settings menu
|
|||
|
// "pip", // Picture-in-picture (currently Safari only)
|
|||
|
// "airplay", // Airplay (currently Safari only)
|
|||
|
"download", // Show a download button with a link to either the current source or a custom URL you specify in your options
|
|||
|
// "fullscreen", // Toggle fullscreen
|
|||
|
],
|
|||
|
speed: { selected: 1, options: [0.75, 1, 1.5, 2] },
|
|||
|
},
|
|||
|
};
|
|||
|
},
|
|||
|
|
|||
|
methods: {
|
|||
|
/**
|
|||
|
* گرفتن عکس از ویدیو.
|
|||
|
* این متد یک عکس از ویدیویی که در آن زمان مشخص شده است، گرفته و آن را به عنوان پوستر ویدیو تنظیم میکند.
|
|||
|
*/
|
|||
|
captureSnapshot() {
|
|||
|
// var video = this.$refs.mediaPlayer;
|
|||
|
// this.canvas = document.getElementById("snapshotCanvas");
|
|||
|
// var context = canvas.getContext("2d");
|
|||
|
|
|||
|
// canvas.width = video.videoWidth;
|
|||
|
// canvas.height = video.videoHeight;
|
|||
|
|
|||
|
// video.currentTime = 10;
|
|||
|
|
|||
|
// context.drawImage(video, 0, 0, canvas.width, canvas.height);
|
|||
|
|
|||
|
var container = document.getElementById("myVid"),
|
|||
|
video = document.createElement("video"),
|
|||
|
canCapture = true;
|
|||
|
if (!video.canPlayType("video/wmv")) {
|
|||
|
/* If you don't have multiple sources, you can load up a Flash fallback here
|
|||
|
(like jPlayer), but you won't be able to capture frames */
|
|||
|
canCapture = false;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
video.src = this.file.attachment.url;
|
|||
|
video.currentTime = "10.0";
|
|||
|
|
|||
|
container.appendChild(video);
|
|||
|
video.play(); //or put this in a button click handler if you want your own controls
|
|||
|
|
|||
|
var canvas = document.createElement("canvas");
|
|||
|
canvas.width = 640;
|
|||
|
canvas.height = 480;
|
|||
|
var ctx = canvas.getContext("2d");
|
|||
|
// if you want to preview the captured image,
|
|||
|
// attach the canvas to the DOM somewhere you can see it.
|
|||
|
|
|||
|
//draw image to canvas. scale to target dimensions
|
|||
|
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
|
|||
|
|
|||
|
//convert to desired file format
|
|||
|
this.$refs.plyr.player.poster = canvas.toDataURL("image/jpeg"); // can also use 'image/png'
|
|||
|
},
|
|||
|
/**
|
|||
|
* فرمت کردن حجم فایل.
|
|||
|
* این متد حجم فایل را به صورت خوانا و فرمتداده شده با واحدهای مناسب برمیگرداند.
|
|||
|
*
|
|||
|
* @param {number} bytes - حجم فایل به بایت
|
|||
|
* @param {number} [decimals=2] - تعداد اعشار برای نمایش
|
|||
|
* @returns {string} - حجم فایل به صورت فرمتداده شده
|
|||
|
*/
|
|||
|
formatBytes(bytes, decimals = 2) {
|
|||
|
if (!+bytes) return "0 Bytes";
|
|||
|
|
|||
|
const k = 1024;
|
|||
|
const dm = decimals < 0 ? 0 : decimals;
|
|||
|
const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
|||
|
|
|||
|
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|||
|
|
|||
|
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
|
|||
|
},
|
|||
|
},
|
|||
|
mounted() {
|
|||
|
// this.captureSnapshot()
|
|||
|
},
|
|||
|
};
|
|||
|
</script>
|
|||
|
|
|||
|
<style scoped></style>
|