vue 移动端ios语音播放WAV格式语音文件

<template>
  <div class="voice-play-back">
    <p class="voice-detail" @click="toDetail">详情</p>
    <audio
      @timeupdate="updateProgress"
      controls
      ref="audioRef"
      hidden
      @ended="audioEnded"
    >
      <!-- <source src="https://robot.wewecall.com/unified-service/background/file/download?cache=true&url=znkf/M02/51/96/rBoKDmJ4t1iAZmyDADBaYMczSa4149.WAV" type="audio/wav" /> -->
      <source :src="fileurl" type="audio/wav" v-if="fileurl" />
      您的浏览器不支持音频播放
    </audio>
    <div class="audio-right">
      <div class="audio-time">
        <span id="audioCurTime">{{ audioStart }}</span>
        <span>/</span>
        <span>{{ duration }}</span>
      </div>

      <!-- <div class="progress-bar-bg" id="progressBarBg" v-dragto="setAudioIcon">
        <div class="progress-bar" id="progressBar"></div>
      </div> -->
      <van-slider
        v-model="value"
        bar-height="8px"
        button-size="18px"
        active-color="var(--Color)"
        @change="onChange"
        @drag-start="dragStart"
        class="progress-bar"
      />
      <img
        src="@/assets/greenImgs/voice/bofang.png"
        v-show="audioStatus == 'play'"
        alt=""
        @click="playAudio"
      />
      <img
        v-show="audioStatus == 'pause'"
        src="@/assets/greenImgs/voice/zanting.png"
        alt=""
        @click="playAudio"
      />
    </div>
  </div>
</template>

<script>
import axios from "axios";
export default {
  data() {
    return {
      audioStatus: "play",
      audioStart: "00:00",
      duration: "00:00",
      value: 0,
      isMove: false,
      fileurl: "",
    };
  },
  computed: {},
  mounted() {
    this.getDetail();
  },
  methods: {
    toDetail() {
      this.audioStatus = "play";
      this.$emit("toDetail");
    },
    getDetail() {
      if (this.$route.query.id) {
        //拿到id说明是智能外呼过来的数据
        let params = {
          whid: this.$route.query.id,
          operationType: "getCalloutResult",
          beanName: "znWhglService",
        };

        this.$Api
          .agentRemote(params, {
            needForm: true,
          })
          .then((res) => {
            axios({
              methods: "GET",
              url: res.data.result.aHref,
              responseType: "blob",
            })
              .then((res) => {
                console.log("***********123", res);
                const binaryData = [];
                binaryData.push(res.data);
                this.fileurl = window.URL.createObjectURL(
                  new Blob(binaryData, { type: "audio/wav" })
                );

                this.fetch();
              })
              .catch((err) => {
                console.log(err);
              });
          });
      }
    },
    //开始拖动的时候
    dragStart() {
      console.log("开始拖动");
      let audio = this.$refs.audioRef;
      if (this.audioStatus == "pause") {
        audio.pause();
        this.audioStatus = "play";
      }
    },
    onChange(value) {
      console.log("2222");
      let audio = this.$refs.audioRef;
      // 只有音乐开始播放后才可以调节,已经播放过但暂停了的也可以
      let ratemin = value / 100;
      audio.currentTime = audio.duration * ratemin;
      audio.play();
      this.audioStatus = "pause";
    },
    fetch() {
      var myVid = this.$refs.audioRef;
      myVid.loop = false;

      if (myVid != null) {
     // ios与安卓的不同获取音频时长的方式
    //在微信浏览器中还是不可以,其他浏览器中可以,最后取了接口返回的音频时长
        if (this.$utils.ckos() == "ios") {
          myVid.addEventListener("loadedmetadata", () => {
            const totalTime = myVid.duration || 0;
            console.log("22222", totalTime);
            this.duration = this.transTime(myVid.duration); // 计算音频时长
          });
        } else {
          myVid.oncanplay = () => {
            console.log("22222", myVid.duration);
            this.duration = this.transTime(myVid.duration); // 计算音频时长
          };
        }
        myVid.volume = 0.5; // 设置音量50%
      }
    },
    // 播放暂停控制
    playAudio() {
      let recordAudio = this.$refs.audioRef; // 获取audio元素
      if (recordAudio.paused) {
        recordAudio.play();
        this.audioStatus = "pause";
      } else {
        recordAudio.pause();
        this.audioStatus = "play";
      }
    },
    // 更新进度条与当前播放时间
    updateProgress(e) {
      var Progressvalue = e.target.currentTime / e.target.duration;
      let recordAudio = this.$refs.audioRef; // 获取audio元素
      if (recordAudio) {
        this.value = Progressvalue * 100;
        if (e.target.currentTime === e.target.duration) {
          this.audioStatus = "pause";
        }
      } else {
        this.audioStatus = "pause";
      }
      this.audioStart = this.transTime(this.$refs.audioRef.currentTime);
    },
    audioEnded() {
      this.audioStatus = "play";
    },
    /**
     * 音频播放时间换算
     * @param {number} value - 音频当前播放时间,单位秒
     */
    transTime(time) {
      var duration = parseInt(time);
      var minute = parseInt(duration / 60);
      var sec = (duration % 60) + "";
      var isM0 = ":";
      if (minute === 0) {
        minute = "00";
      } else if (minute < 10) {
        minute = "0" + minute;
      }
      if (sec.length === 1) {
        sec = "0" + sec;
      }
      return minute + isM0 + sec;
    },
    setAudioIcon() {
      this.audioStatus = "pause";
    },
  },
};
</script>

<style lang="less"  scoped>
.voice-play-back {
  padding: 0 20px;
  .voice-detail {
    text-align: right;
    font-size: 26px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: #57bd77;
    margin-bottom: 30px;
    margin-top: -50px;
  }
}

.audio-right {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
  .progress-bar {
    flex: 1;
    margin-right: 25px;
  }
  .audio-time {
    width: 190px;
    font-size: 26px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: #666666;
    display: flex;
    min-height: 10px;
    // font-family: monospace;
    // font-variant-numeric: tabular-nums;
    font-variant-numeric: tabular-nums;
  }
  img {
    width: 50px;
    margin-left: 10px;
  }
}
</style>


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容