base_ui/components/other/MyPluginAudioRecorder.vue
2025-02-01 13:04:55 +03:30

165 lines
4.0 KiB
Vue

<template>
<div class="vue-record-container">
<vue-record-audio mode="press" @stream="onStream" @result="onResult">
</vue-record-audio>
<button
v-if="recording"
@click.prevent="removeRecordFile()"
class="btn send-record-btn"
>
<svg class="icon icon-Component-295--1">
<use xlink:href="#icon-Component-295--1"></use>
</svg>
</button>
</div>
<!-- <vue-record-audio @result="onResult" /> -->
<!-- <Component :mode="'press'" @stream="onStream" @result="onResult" /> -->
</template>
<script>
// import "assets/common/js/RecordRTC.js";
export default {
mounted() {
// this.uuid = Math.floor(Math.random() * 100);
// addJsCssFileToDom("/js/RecordRTC.js", "js", this.uuid);
// this.getLocalStream();
},
destroy() {
this.recorder?.removeEventListener("dataavailable", onDataAvailable);
this.recorder?.removeEventListener("stop", onStopRecording);
},
data() {
return {
newAudio: null,
recorder: null,
saveAudio: false,
recordedChunks: [],
};
},
computed: {
// newAudioURL() {
// return URL.createObjectURL(this.newAudio);
// },
},
methods: {
onStream(mediaStream) {
// در صورت استفاده از پلاگین
this.mediaStream = mediaStream;
this.recording = true;
},
replayOnStream() {
this.replayRecording = true;
},
onStopRecording() {
const audioTracks = this.mediaStream.getAudioTracks();
audioTracks.forEach((element) => {
element.stop();
});
this.recording = false;
},
removeRecordFile() {
this.refreshRecorder++;
this.recording = false;
this.abortRecord = true;
},
replayRemoveRecordFile() {
this.replayRefreshRecorder++;
this.replayRecording = false;
this.replayAbortRecord = true;
},
onDataAvailable(e) {
this.recordedChunks = [];
this.$emit("onStream");
if (e.data.size > 0) {
this.recordedChunks.push(e.data);
}
},
onStopRecording(mediaStream2) {
this.newAudio = new Blob(this.recordedChunks);
this.recorder.stop();
const audioTracks = mediaStream2.target.stream.getAudioTracks();
audioTracks.forEach((element) => {
element.stop();
});
this.recorder = null;
if (this.saveAudio) this.$emit("send", this.newAudio);
},
async record() {
this.newAudio = null;
try {
const mediaStream = await navigator.mediaDevices.getUserMedia({
audio: true,
video: false,
});
// const options = { mimeType: "audio/webm" };
// this.recorder = new MediaRecorder(mediaStream, options);
this.recorder = new MediaRecorder(mediaStream);
this.recorder.start();
this.recorder.addEventListener("dataavailable", this.onDataAvailable);
this.recorder.addEventListener("stop", this.onStopRecording);
} catch (err) {
mySwalToast({
title:
"مرورگر شما از قابلیت ارسال صدا پشتیبانی نمیکند.لطفا مرورگر خود را به آخرین ورژن ارتقا دهید.",
icon: "error",
timer: 7000,
});
}
},
stop() {
this.saveAudio = true;
this.recorder.stop();
},
cancel() {
this.saveAudio = false;
this.recorder.stop();
},
},
};
</script>
<style scoped lang="scss">
// .vue-audio-recorder {
// position: relative;
// background-color: #4db6ac;
// border-radius: 50%;
// width: 64px;
// height: 64px;
// display: inline-block;
// cursor: pointer;
// -webkit-box-shadow: 0 0 0 0 rgba(232,76,61,.7);
// box-shadow: 0 0 0 0 rgba(232,76,61,.7);
// width: 1.9em;
// height: 1.9em;
// padding: 0.5em;
// background-size: 70%;
// background-position: center center;
// background-repeat: no-repeat;
// &.active {
// background-color: #ef5350;
// -webkit-animation: pulse 1.25s cubic-bezier(.66,0,0,1) infinite;
// animation: pulse 1.25s cubic-bezier(.66,0,0,1) infinite;
// }
// }
</style>