inner-audio-path.uvue 3.7 KB
Newer Older
DCloud-WZF's avatar
DCloud-WZF 已提交
1
<template>
2 3 4
  <!-- #ifdef APP -->
  <scroll-view style="flex: 1;">
  <!-- #endif -->
DCloud-WZF's avatar
DCloud-WZF 已提交
5 6 7 8 9 10 11 12
    <view class="uni-title">
      <text class="uni-title-text">音频路径示例</text>
    </view>
    <view class="formats" v-for="(item,index) in supportPaths" :key="index">
      <text class="uni-subtitle-text">{{item.description}}</text>
      <image class="icon-play" :src="(isPlaying && playIndex==index)?'/static/pause.png':'/static/play.png'"
        @click="play(item.src,index)"></image>
    </view>
13 14 15
  <!-- #ifdef APP -->
  </scroll-view>
  <!-- #endif -->
DCloud-WZF's avatar
DCloud-WZF 已提交
16 17 18 19 20 21 22 23 24 25 26
</template>

<script>
  type AudioPath = {
    description : string
    src : string
  }
  export default {
    data() {
      return {
        playIndex: 0,
27 28 29 30 31 32 33
        isPlaying: false,
        // #ifdef APP
        nativePath: uni.env.CACHE_PATH + 'uni-audio/test/test.mp3' as string,
        // #endif
        // #ifdef APP-ANDROID
        sdcardPath: 'sdcard/uni-audio/test.mp3',
        // #endif
DCloud-WZF's avatar
DCloud-WZF 已提交
34 35 36 37 38 39
        _audioContext: null as InnerAudioContext | null,
        supportPaths: [
          {
            description: '本地路径:/static方式',
            src: '/static/test-audio/ForElise.mp3'
          },
40
          {
DCloud-WZF's avatar
DCloud-WZF 已提交
41 42
            description: '本地路径:../static/',
            src: '../../../static/test-audio/ForElise.mp3'
43 44 45 46 47 48 49
          },
          // #ifdef APP
          {
            description: '本地路径:env方式',
            src: 'env'
          },
          // #endif
DCloud-WZF's avatar
DCloud-WZF 已提交
50 51 52 53 54 55 56 57 58 59
          {
            description: '网络路径',
            src: 'https://web-ext-storage.dcloud.net.cn/uni-app-x/audio/ForElise.mp3'
          },
          {
            description: '不存在的音频',
            src: 'https://web-ext-storage.dcloud.net.cn/uni-app-x/audio/invalid_url.mp3'
          },
          {
            description: '错误路径',
M
mahaifeng 已提交
60
            src: '../static/test-audio/ForElise22.mp3'
DCloud-WZF's avatar
DCloud-WZF 已提交
61 62 63 64 65
          },
        ] as Array<AudioPath>
      }
    },
    onReady() {
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
      this._audioContext = uni.createInnerAudioContext();
      this._audioContext!.onPlay(() => {
        console.log('开始播放');
      });
      this._audioContext!.onEnded(() => {
        console.log('播放结束');
        this.isPlaying = false;
      });
      this._audioContext!.onError((err) => {
        this.isPlaying = false;
        console.log('err', err);
      });

      // #ifdef APP
      const fileManager = uni.getFileSystemManager()
      try {
        fileManager.rmdirSync(uni.env.CACHE_PATH + 'uni-audio/test', true)
      } catch (e) {
      }

      try {
        fileManager.mkdirSync(uni.env.CACHE_PATH + 'uni-audio/test', true)
      } catch (e) {
      }
      try {
        fileManager.copyFileSync(
          '/static/test-audio/ForElise.mp3',
          this.nativePath)
      } catch (e) {
      }
      // #endif
    },

DCloud-WZF's avatar
DCloud-WZF 已提交
99 100 101 102 103 104 105 106 107 108 109
    onUnload() {
      if (this._audioContext != null) {
        this.pause();
        this._audioContext!.destroy()
      }
    },
    methods: {
      pause() {
        this._audioContext!.pause();
        this.isPlaying = false;
      },
110 111
      play(audioUrl : string, index : number) {
        console.log(index, audioUrl);
DCloud-WZF's avatar
DCloud-WZF 已提交
112 113 114
        if (this.isPlaying && this.playIndex == index) {
          this.pause();
          return;
115 116 117 118 119 120 121
        }
        // #ifdef APP
        if (audioUrl == 'env') {
          audioUrl = this.nativePath
        }
        // #endif

DCloud-WZF's avatar
DCloud-WZF 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
        this.playIndex = index
        this._audioContext!.src = audioUrl;
        this._audioContext!.play();
        this.isPlaying = true;
      }
    }
  }
</script>

<style>
  .formats {
    align-items: center;
  }

  .icon-play {
    width: 60px;
    height: 60px;
    margin: 10px;
  }
141
</style>