165 lines
4.0 KiB
Vue
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>
|