收藏
回答

小程序能不能直接使用base64音频文件播放?

使用createInnerAudioContext方法来,存文件到云服务器太费流量了

回答关注问题邀请回答
收藏

3 个回答

  • 闸蟹
    闸蟹
    01-08
    感谢博主分享 。  改进了一个demo 临时文件 + uniapp + vue3 ts 实现的demo。 多段base64音频合并播放。 最终语音为 深圳。(最后的语音有点断,因为太长了评论超长了)  
    
    // AudioPlayer.vue
    
    import { ref } from "vue";
    import { testData } from './videoAudioChunks'
    
    
    interface AudioMessage {
      header: {
        code: number;
        message: string;
        sid: string;
        status: number;
      };
      payload?: {
        audio?: {
          audio: string;
          bit_depth: number;
          ced: string;
          channels: number;
          encoding: string;
          frame_size: number;
          id: string;
          sample_rate: number;
          seq: number;
          status: number;
          type: string;
        };
      };
    }
    
    
    interface AudioChunk {
      array: Uint8Array;
      seq: number;
      id: string;
    }
    
    
    const playing = ref(false);
    const currentAudioPath = ref('');
    
    
    // 生成临时文件路径
    const generateTempFilePath = () => {
      const timestamp = new Date().getTime();
      return `${uni.env.USER_DATA_PATH}/temp_audio_${timestamp}.mp3`;
    };
    
    
    // 清理临时文件
    const cleanupTempFile = (filePath: string) => {
      const fs = uni.getFileSystemManager();
      fs.access({
        path: filePath,
        success: () => {
          fs.unlink({
            filePath,
            success: () => {
              console.log('临时文件清理成功');
            },
            fail: (err) => {
              console.error('清理临时文件失败:', err);
            }
          });
        }
      });
    };
    
    
    // 处理并播放音频
    const processAndPlay = () => {
      const uniqueChunks = new Map<string, AudioChunk>();
      const audioJson = testData
    
    
      // 处理每个音频消息
      audioJson.forEach((message) => {
        if (message.header.code === 0 && message.payload?.audio) {
          const audio = message.payload.audio;
          const key = `${audio.id}_${audio.seq}`;
    
    
          // 仅处理未见过的块
          if (!uniqueChunks.has(key)) {
            const audioData = audio.audio;
            uniqueChunks.set(key, {
              array: new Uint8Array(
                atob(audioData)
                  .split("")
                  .map((char) => char.charCodeAt(0))
              ),
              seq: audio.seq,
              id: audio.id,
            });
          }
        }
      });
    
    
      // 按id和seq排序块
      const sortedChunks = Array.from(uniqueChunks.values()).sort((a, b) => {
        if (a.id === b.id) {
          return a.seq - b.seq;
        }
        return parseInt(a.id) - parseInt(b.id);
      });
    
    
      // 合并所有音频块
      const totalLength = sortedChunks.reduce(
        (acc, chunk) => acc + chunk.array.length,
        0
      );
      const combinedArray = new Uint8Array(totalLength);
      let offset = 0;
      sortedChunks.forEach((chunk) => {
        combinedArray.set(chunk.array, offset);
        offset += chunk.array.length;
      });
    
    
      // 生成新的临时文件路径
      const tempAudioPath = generateTempFilePath();
      const fs = uni.getFileSystemManager();
    
    
      // 清理之前的临时文件
      if (currentAudioPath.value) {
        cleanupTempFile(currentAudioPath.value);
      }
    
    
      // 将合并后的数据转换为base64
      const base64Data = uni.arrayBufferToBase64(combinedArray);
    
    
      // 写入文件并播放
      fs.writeFile({
        filePath: tempAudioPath,
        data: base64Data,
        encoding: "base64",
        success() {
          currentAudioPath.value = tempAudioPath;
          const backgroundAudioManager = uni.getBackgroundAudioManager();
          backgroundAudioManager.title = "音频播放";
          backgroundAudioManager.src = tempAudioPath;
          playing.value = true;
    
    
          backgroundAudioManager.onEnded(() => {
            playing.value = false;
            // 播放结束后清理临时文件
            cleanupTempFile(tempAudioPath);
            currentAudioPath.value = '';
          });
        },
        fail(err) {
          console.error("写入音频文件失败:", err);
        },
      });
    };
    
    
    
    
    
    
    
    
    
    
    
    
    


    01-08
    有用
    回复 1
    • 闸蟹
      闸蟹
      01-08
      const testData = [{"header":{"code":0,"message":"success","sid":"1","status":0}},
          {"header":{"code":0,"message":"success","sid":"2","status":1},"payload":{"audio":{"audio":"//NkxAAMoA5WXhiEAABe0VVrL+PtR0OB/a+6T29pwWOa7k+8+/yH63/Z/UMS2yvkf/hgp5wpf//+7763z6P+lSvq7bcsMkqqJ2RU43AzTArM7OX6pHDmwybUyov93X9H6LBRihrN6/9T//Xou/b+t6u3/+71cqphxlf5LdRtiIyaLmptqo5RQGqLBs4qHOex//NkxFANmKplnhhEOruZ1I9EnQpXla/s6f/RdNfvt68d9fQv/XUZu6pMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqWfK9uOwWQicjfNPItGp2z3zcUoM4cJWW5ns8dMuoyVTV3AX22InC9gFo0s0dy3L5k36D//AKCTyRogVzLkwsy5ihPhhldDkI1Wpv//NkxJwNMAZWPghEALIEYx7HuQkAgF0mJADxE9CZw/pWG7/OtxzZtUxX+foxzLZvQc0v03qUbnjcl3n2LIMUagdTmKUuKTt72L2yqVjZRvFH12NUZFVc1ZTfTLbEJLJH4XUaaMpr5hVSvYyX+yXJIaHLMegk197+7+Z4+7+1Kiu7h09+pWusyqfaMvOaNMPx//NkxM4Ugko9nghFHNu0G8vdWcZbfZWyp7Pxtjf13MaqC9MvrR5re20XxL1ohZZ+dbbvt9vt5qbD6vnqxoLcUiP2WFEqVgTCGFM/2TQmxvuyfSQFaCjF0cknxjaEqBxArJDQISsskaN0mz44x8DgImRYXIIRB8M3PEWHNHAWSJkHOGgjU6HoB4hnCRFynCQK//NkxP8n3DIZVUxYAcgmJ0JkiZBz6CiJjwQATmUjpBCeKrmRgi7LZN09RTLhFCIGxJmRUGTmZmgkQw6br3236BgRcnzcZsvE4kThusuEwx8+YJImRoyf//k/UiX0VGhmX3N0FmiB2TB2eQc0V3of///dX39D/k+m0uLOn2Nz6i+fUjcVdkkkiIXpy1z+ZWkM//NkxOI1VB66X4+QAxRTxGp14ScD09JTn6/LH7bqdZy3XrczbQ8TOLIoSWT4bWbykBijKh6UxDHeyu76EdtQnwkHqsuEwwTUJETOKVRPWn505LDhXM1LDqdefvoR4Z+syTiJ99ZFk3bvnb9+hhx222w4MIofb5ZlbKJyKA4UbddE+cC9I6eWodnatOZrmXjg//NkxI81hDrGV8NgAvF92HEpPJZPTvOg0OCQagmjA/x2RDNf52IZb8kXuOZmrKgiQvkxDMzONIscnpXzOPav9fdyT+WFq9ceHhYO1foSrfODyt3+","bit_depth":16,"ced":"19","channels":1,"encoding":"lame","frame_size":0,"id":"0","sample_rate":24000,"seq":1,"status":1,"type":"0"}}},
          {'header': {'code': 0, 'message': 'success', 'sid': '3', 'status': 1}, 'payload': {'audio': {'audio': '//NkxAAMoA5WXhiEAABe0VVrL+PtR0OB/a+6T29pwWOa7k+8+/yH63/Z/UMS2yvkf/hgp5wpf//+7763z6P+lSvq7bcsMkqqJ2RU43AzTArM7OX6pHDmwybUyov93X9H6LBRihrN6/9T//Xou/b+t6u3/+71cqphxlf5LdRtiIyaLmptqo5RQGqLBs4qHOex//NkxFANmKplnhhEOruZ1I9EnQpXla/s6f/RdNfvt68d9fQv/XUZu6pMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqWfK9uOwWQicjfNPItGp2z3zcUoM4cJWW5ns8dMuoyVTV3AX22InC9gFo0s0dy3L5k36D//AKCTyRogVzLkwsy5ihPhhldDkI1Wpv//NkxJwNMAZWPghEALIEYx7HuQkAgF0mJADxE9CZw/pWG7/OtxzZtUxX+foxzLZvQc0v03qUbnjcl3n2LIMUagdTmKUuKTt72L2yqVjZRvFH12NUZFVc1ZTfTLbEJLJH4XUaaMpr5hVSvYyX+yXJIaHLMegk197+7+Z4+7+1Kiu7h09+pWusyqfaMvOaNMPx//NkxM4Ugko9nghFHNu0G8vdWcZbfZWyp7Pxtjf13MaqC9MvrR5re20XxL1ohZZ+dbbvt9vt5qbD6vnqxoLcUiP2WFEqVgTCGFM/2TQmxvuyfSQFaCjF0cknxjaEqBxArJDQISsskaN0mz44x8DgImRYXIIRB8M3PEWHNHAWSJkHOGgjU6HoB4hnCRFynCQK//NkxP8n3DIZVUxYAcgmJ0JkiZBz6CiJjwQATmUjpBCeKrmRgi7LZN09RTLhFCIGxJmRUGTmZmgkQw6br3236BgRcnzcZsvE4kThusuEwx8+YJImRoyf//k/UiX0VGhmX3N0FmiB2TB2eQc0V3of///dX39D/k+m0uLOn2Nz6i+fUjcVdkkkiIXpy1z+ZWkM//NkxOI1VB66X4+QAxRTxGp14ScD09JTn6/LH7bqdZy3XrczbQ8TOLIoSWT4bWbykBijKh6UxDHeyu76EdtQnwkHqsuEwwTUJETOKVRPWn505LDhXM1LDqdefvoR4Z+syTiJ99ZFk3bvnb9+hhx222w4MIofb5ZlbKJyKA4UbddE+cC9I6eWodnatOZrmXjg//NkxI81hDrGV8NgAvF92HEpPJZPTvOg0OCQagmjA/x2RDNf52IZb8kXuOZmrKgiQvkxDMzONIscnpXzOPav9fdyT+WFq9ceHhYO1foSrfODyt3+', 'bit_depth': 16, 'ced': '19', 'channels': 1, 'encoding': 'lame', 'frame_size': 0, 'id': '0', 'sample_rate': 24000, 'seq': 1, 'status': 1, 'type': '0'}}},
          {"header":{"code":0,"message":"success","sid":"4","status":1},"payload":{"audio":{"audio":"rOi6u3QDJOdtrZVQjXa8VIIoSrE4k6TK6rBOrsqej2U07VQe/XT9SSWjxUUVSkIiVEG1FBPlF8RPEibk//NkxDwsJDrPDkjNpF1kJojcICVagBPTwbuhdh6GbsDFvViEAI0LAsgMmDq7VpY/bmHAnqD0+gTZ/CBi/X3MjEP3XSBkJ3EHnSDptF20PtXuY7vUg+shD7E6Ts99+nlf37B14LJ3/dkKJvw8ENh87E0EPZhNaRzjTANI5Cws+iCA9b793cuXMCCnMKNiNIph//NkxA4grALnFhhHhVmBZhhYKm4O5BVPqyn70Mn+6oIPKkUegwYP0CW7THZDbqnDsmFoJiTr+eWX58PgQYwPQJuGfVFKnUvKRlx7LT7HMyzsp/F7yqCy4nLDdT5OTtcmMrgzkF8ZXp7k5rNCVyJ0iPHgzLiL5IpghAGrDOoP/sWYYmmHiPrUIVj/ogRglaMT//NkxA4dY7rq7EjFOrbhwKIFWhKpfKMTpLEp1Tqg6eLasgPPpDPSPm5OZ8GMpE0nKpwq5eJOgjaviL2WwvvcyvHDHTi/dTbsgKm2dkpk1A1d5kl62Wt/9msvXX+tt9HL6U/pZ2lServRqPBMWtVsmLLJ0SKaeXd3+schmjo+MxaGSKJxafrVKGO5PPjmiorn//NkxBscSWbu7GGG0vR6By1NXY/uW2ut320zYb22YUORQQvGzM6lbby5mtcGhrgUMHcry9wS1MBYVCRY0bjkAqVYJhU6t7ZqnjmjM8VIwqh+2XdstAJtq0vOyIBOsValStGK1Wl3Z9Y09pqzwQ4loLBAaOZnqLHPFMYzLZjFINKCzEKgjXSDgFBkOyplc5Jm//NkxCwcAdrm7OaEVib1RS32LwA7/ec/1dklkvK6Kl5QEy1JgjlqAsjmylMjqz1KWrN/+n2wz9ECgqbDS8GiSzueqDtuVd4B/2f/57+Gv/Rov5CNWXlmsy7xmtv7KqxhYkY4lmv4IOuUHv1qbNBWBJhHg5qNnUcSYncu8lK2lv48/+gJP1lvk9MmI+6p0FPf//NkxD8cgd7bHtsFCL3CWMo82DE3xkayQ28wVm5HISkv/rUh6PMryiRIF3B9P1/t9czeNJfwEKq///2xYv6NbqwBV7nfKlbkVeUV5hZY4GB8NZ/dWzZZFD/PlSRfXmn8K4whBqdv8/CNEx7trO5iYll84IE3jtApjWb0Vi6Z1WOAG/xT6N7BHRWKrfTfKIbZ//NkxFAbadraVsNLKoXYkwv/+nh3rZEEeL1P4bWtv/9FHc8sLidDKzqoqtABRtJatlmJ+7Gc466OBHOKVI/vksNdQvseGWiPazbZFSIIN35/7aTiLLFxurLi/xUwr/GdRi7OUZjOpQ1W1YXrpZqOjt0Gjlbsxb6KlFjAVpKjmMuhn//9fX/7aLb////+//////NkxGUcK86+dsPKfP/969Do49Q/ndZLbQ==","bit_depth":16,"ced":"19","channels":1,"encoding":"lame","frame_size":0,"id":"1","sample_rate":24000,"seq":2,"status":1,"type":"0"}}},
          {'header': {'code': 0, 'message': 'success', 'sid': '5', 'status': 1}, 'payload': {'audio': {'audio': 'rOi6u3QDJOdtrZVQjXa8VIIoSrE4k6TK6rBOrsqej2U07VQe/XT9SSWjxUUVSkIiVEG1FBPlF8RPEibk//NkxDwsJDrPDkjNpF1kJojcICVagBPTwbuhdh6GbsDFvViEAI0LAsgMmDq7VpY/bmHAnqD0+gTZ/CBi/X3MjEP3XSBkJ3EHnSDptF20PtXuY7vUg+shD7E6Ts99+nlf37B14LJ3/dkKJvw8ENh87E0EPZhNaRzjTANI5Cws+iCA9b793cuXMCCnMKNiNIph//NkxA4grALnFhhHhVmBZhhYKm4O5BVPqyn70Mn+6oIPKkUegwYP0CW7THZDbqnDsmFoJiTr+eWX58PgQYwPQJuGfVFKnUvKRlx7LT7HMyzsp/F7yqCy4nLDdT5OTtcmMrgzkF8ZXp7k5rNCVyJ0iPHgzLiL5IpghAGrDOoP/sWYYmmHiPrUIVj/ogRglaMT//NkxA4dY7rq7EjFOrbhwKIFWhKpfKMTpLEp1Tqg6eLasgPPpDPSPm5OZ8GMpE0nKpwq5eJOgjaviL2WwvvcyvHDHTi/dTbsgKm2dkpk1A1d5kl62Wt/9msvXX+tt9HL6U/pZ2lServRqPBMWtVsmLLJ0SKaeXd3+schmjo+MxaGSKJxafrVKGO5PPjmiorn//NkxBscSWbu7GGG0vR6By1NXY/uW2ut320zYb22YUORQQvGzM6lbby5mtcGhrgUMHcry9wS1MBYVCRY0bjkAqVYJhU6t7ZqnjmjM8VIwqh+2XdstAJtq0vOyIBOsValStGK1Wl3Z9Y09pqzwQ4loLBAaOZnqLHPFMYzLZjFINKCzEKgjXSDgFBkOyplc5Jm//NkxCwcAdrm7OaEVib1RS32LwA7/ec/1dklkvK6Kl5QEy1JgjlqAsjmylMjqz1KWrN/+n2wz9ECgqbDS8GiSzueqDtuVd4B/2f/57+Gv/Rov5CNWXlmsy7xmtv7KqxhYkY4lmv4IOuUHv1qbNBWBJhHg5qNnUcSYncu8lK2lv48/+gJP1lvk9MmI+6p0FPf//NkxD8cgd7bHtsFCL3CWMo82DE3xkayQ28wVm5HISkv/rUh6PMryiRIF3B9P1/t9czeNJfwEKq///2xYv6NbqwBV7nfKlbkVeUV5hZY4GB8NZ/dWzZZFD/PlSRfXmn8K4whBqdv8/CNEx7trO5iYll84IE3jtApjWb0Vi6Z1WOAG/xT6N7BHRWKrfTfKIbZ//NkxFAbadraVsNLKoXYkwv/+nh3rZEEeL1P4bWtv/9FHc8sLidDKzqoqtABRtJatlmJ+7Gc466OBHOKVI/vksNdQvseGWiPazbZFSIIN35/7aTiLLFxurLi/xUwr/GdRi7OUZjOpQ1W1YXrpZqOjt0Gjlbsxb6KlFjAVpKjmMuhn//9fX/7aLb////+//////NkxGUcK86+dsPKfP/969Do49Q/ndZLbQ==', 'bit_depth': 16, 'ced': '19', 'channels': 1, 'encoding': 'lame', 'frame_size': 0, 'id': '1', 'sample_rate': 24000, 'seq': 2, 'status': 1, 'type': '0'}}},
          {"header":{"code":0,"message":"success","sid":"","status":1},"payload":{"audio":{"audio":"MAAKCFdj+ml3OY/ugFVADV5ZunarKVM3Qlt63D9Myam90pic8yFuSa9P+9zAUlreCi3u8ZF/8B1Is61dGn397fb1EhGPZFPaY3+vRHZXcFU3dP//Sun9/9v/mT/+/wbkJATrewtfs1RLWuGTpIs7+lVTAShHiI3/82TEdxwTGrMW0gUMdr/r/p/q7I/Ce3ev/VRDzkT3xgkRTWjStbmADAs2xnkvITKFrcackxN5UpypJUjjKuAFpxD937oJcpaMUpXVj/v+N61LJbUSX7d9H/X9///T9P/+iMceFDXo7mY3////O1mSPFrWez0qgEMIDMEvc9gkjML7pr60uWLFlVaLQhDVBYP/82TEiRubzuceeksmrHKeVsvDAlek1KJRbIAt7lrQUb9kAYxdHODe0ph7F59cnMmMBkLCeCCyF9IiOpUFxYALKlyY0mOet5cWCALvB81WbiAMNh+ctd//+8RBI8UIt//QwJQVEtFdl1uVxnCUiKnA2K9U5yDvvRAKCXyXZpnfuvnT5p/rduqbZEYGC9OXoFj/82TEnRzo8o0UZtI0tWD2dEtfA4SyevlY+PYln8jmB8G4/sHBgeadn8axhYsbJYliWWzs8q2+hGDjCw/PyQtEMt8OaMS1bDcbhUBA1BoiOwbiWDct+SDOMQBEcSCQoYP19ITMnn92yxCvudk9+mnDk5OLKUb+lfYccpe+U7fuvcnFjlFh5UwivK87XxsL/YP/82TErDTcMqAAeZh4hZza/9JYlq5X/N1ixZTbtr8Oz/2FlV98v806/7+LIm1+Tel5mjkL6vsLAnBMH40au7d//7bM9FYuYj0LR44qVk8Xkh1tOWGjNKSyCFA2A2DMfDEpEolloDojFOwQGRYSrSeov7B2+c3pC/RTLTN1Chh0cQ6dFfI6xCY4HQjDpqk8MwX/82TEWzFUMrQAOxNVSmZlkkFM6OI6LR6XnaATCALoB4aO0RmyBGOEboGyVmSNlnkKJlEmr7pdVSajM88rgzKmnRWaZ1tVcuhSjcUkT7RfbUOrMKOgEqVIjrbep2ettAs0cRIkeGG2q733G4LJUz4PZpHJZ2xdQ+rJa3u7uDDQqKaWKrFLaBmI6kchIGqNVgz/82TEGCHhPtcWzpCQ12Co26RgMH0PBiMmAOLAzOBkSWyRJdKvHIYZm19iD/y3e7EbjERmJ3QxGqmgHA4Guo5rO1+Gm5JVbVrUkcqRlwseKt8seKF3FQZCQqkasRYaFHiIJptgr8oeqAsJP+L5Pr8Q54r5Vw8BGgoRtCtWuqUAWkuWMmoLfZ795cylMrIhKj3/82TEEyDD0tMe2gUp/2QDoOZ6ah5whgyvW4mhPLWrck8CSWMU4cCyDVD+4DXLLd76kMHVVISDYOUuijg7T/7Q62lmfSyPvuWohZD/RfnV3UzXEugljuVyD2//+ydN23TRaIiKVd1Vm2fr+3/////rp2RHYoIWOAaSnXt+lYcABSxzAtB+3C862NK+5CceF37/82TEEx/BzscWwccIry6IVr0UtlnNzaR7vKrtBflnqXzCgitLav2Sojg5OXmCKR6lAGiToqCS1zoGFAf3eH+VbL5w0ZzBhCMG1LM5oJMGJbSDid4BLjTKXfPMAIiF8VdCtbOoXRcrFCITT/1/pVWHATEgbPujRt+Z","bit_depth":16,"ced":"19","channels":1,"encoding":"lame","frame_size":0,"id":"2","sample_rate":24000,"seq":3,"status":1,"type":"0"}}},
          ];
          

          
      export {
          testData,
      }
      01-08
      回复
  • 雨肖
    雨肖
    2024-01-19

    完美解决了,使用getFileSystemManager、writeFile 将base64音频转为临时mp3文件地址(encoding: 'base64'),再使用getBackgroundAudioManager播放音频即可,可以跨页面播放

    注:使用audio组件会存在兼容问题,部分手机播放不了,也无法跨页面播放音频

    const backgroundAudioManager = wx.getBackgroundAudioManager()
    const audioPath = wx.env.USER_DATA_PATH + '/ordernew.mp3'
    const fs = wx.getFileSystemManager();
    fs.writeFile({
      filePath: audioPath,
      data: item,
      encoding: 'base64',
      success(res) {
        backgroundAudioManager.title = '您有新的订单!'
        backgroundAudioManager.src = audioPath
      },
    })
    
    2024-01-19
    有用
    回复
  • Mr.Zhao
    Mr.Zhao
    2023-02-08

    你可以用临时路径啊

    2023-02-08
    有用
    回复 6
    • Taylor
      Taylor
      2023-02-08
      大佬,是这样的后端接口返回的就是一个文件流
      2023-02-08
      回复
    • Mr.Zhao
      Mr.Zhao
      2023-02-08回复Taylor
      文件流转成临时地址不就行了
      2023-02-08
      回复
    • Mr.Zhao
      Mr.Zhao
      2023-02-08回复Taylor
      我是真没看懂   你这算强行解释了  跟返回文件流有啥关系?
      2023-02-08
      回复
    • Taylor
      Taylor
      2023-02-08回复Mr.Zhao
      用哪个api
      2023-02-08
      回复
    • Taylor
      Taylor
      2023-02-08回复Mr.Zhao
      [12,23,45]这种类型的
      2023-02-08
      回复
    查看更多(1)
登录 后发表内容