pcm转wav、mp3

import lamejs from '@/utils/lame.all'
encodeMono(channels, sampleRate, samples) {
	console.log("开始转码为mp3 >>>>")
	var buffer = [];
	var mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128);
	var remaining = samples.length;
	var maxSamples = 1152;
	for (var i = 0; remaining >= maxSamples; i += maxSamples) {
		var mono = samples.subarray(i, i + maxSamples);
		var mp3buf = mp3enc.encodeBuffer(mono);
		if (mp3buf.length > 0) {
			buffer.push(new Int8Array(mp3buf));
		}
		remaining -= maxSamples;
	}
	
	var d = mp3enc.flush();
	if(d.length > 0){
		buffer.push(new Int8Array(d));
	}
	console.log('done encoding, size=', buffer.length);
	var blob = new Blob(buffer, {type: 'audio/mp3'});
	var bUrl = window.URL.createObjectURL(blob);
    this.mp3Url=bUrl
    console.log('转码完成');
    this.loading=false
}
pcmtoWav(pcmsrt, sampleRate, numChannels, bitsPerSample) {
  //参数->(pcm流,采样频率,声道数,采样位数)
  let header = {
    // OFFS SIZE NOTES
    chunkId: [0x52, 0x49, 0x46, 0x46], // 0    4    "RIFF" = 0x52494646
    chunkSize: 0, // 4    4    36+SubChunk2Size = 4+(8+SubChunk1Size)+(8+SubChunk2Size)
    format: [0x57, 0x41, 0x56, 0x45], // 8    4    "WAVE" = 0x57415645
    subChunk1Id: [0x66, 0x6d, 0x74, 0x20], // 12   4    "fmt " = 0x666d7420
    subChunk1Size: 16, // 16   4    16 for PCM
    audioFormat: 1, // 20   2    PCM = 1
    numChannels: numChannels || 1, // 22   2    Mono = 1, Stereo = 2...
    sampleRate: sampleRate || 16000, // 24   4    8000, 44100...
    byteRate: 0, // 28   4    SampleRate*NumChannels*BitsPerSample/8
    blockAlign: 0, // 32   2    NumChannels*BitsPerSample/8
    bitsPerSample: bitsPerSample || 16, // 34   2    8 bits = 8, 16 bits = 16
    subChunk2Id: [0x64, 0x61, 0x74, 0x61], // 36   4    "data" = 0x64617461
    subChunk2Size: 0, // 40   4    data size = NumSamples*NumChannels*BitsPerSample/8
  }
  function u32ToArray(i) {
    return [i & 0xff, (i >> 8) & 0xff, (i >> 16) & 0xff, (i >> 24) & 0xff]
  }
  function u16ToArray(i) {
    return [i & 0xff, (i >> 8) & 0xff]
  }  
  //let pcm = Base64.toUint8Array(pcmsrt)
  let pcm = new Uint8Array(pcmsrt)
  header.blockAlign = (header.numChannels * header.bitsPerSample) >> 3
  header.byteRate = header.blockAlign * header.sampleRate
  header.subChunk2Size = pcm.byteLength * (header.bitsPerSample >> 3)
  header.chunkSize = 36 + header.subChunk2Size

  let wavHeader = header.chunkId.concat(
    u32ToArray(header.chunkSize),
    header.format,
    header.subChunk1Id,
    u32ToArray(header.subChunk1Size),
    u16ToArray(header.audioFormat),
    u16ToArray(header.numChannels),
    u32ToArray(header.sampleRate),
    u32ToArray(header.byteRate),
    u16ToArray(header.blockAlign),
    u16ToArray(header.bitsPerSample),
    header.subChunk2Id,
    u32ToArray(header.subChunk2Size)
  )
  let wavHeaderUnit8 = new Uint8Array(wavHeader)

  let mergedArray = new Uint8Array(wavHeaderUnit8.length + pcm.byteLength)
  mergedArray.set(wavHeaderUnit8)
  mergedArray.set(pcm, wavHeaderUnit8.length)
  let blob = new Blob([mergedArray], { type: 'audio/wav' })
  let blobUrl = window.URL.createObjectURL(blob)
  console.log('blob',blob);
  this.audioSrc=blobUrl
  console.log('this.audioSrc',this.audioSrc);
  this.isSuccess=true
},

getPCM(url){
  // this.loading=true
  let data= fetch(url).then(res=>res.blob()
  
  ).then(res=>{
    // this.$http.get(this.url).then(res=>{
    console.log(res);
    // this.file=res.arrayBuffer()
   const file1=res
    let reader = new FileReader()
		reader.readAsArrayBuffer(file1)
		reader.onload =  ()=>{
			console.log(reader.result)
          this.pcmtoWav(reader.result)
         let samples = new Int16Array(reader.result)
         this.encodeMono(1, 16000, samples)
             //data = reader.result;
			 // 相当于请求下载pcm文件,转换为wav播放
	// console.log(pcmtoWav(reader.result))
         };
        //  this.loading=false
        })
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android上将MP3换为WAV格式可以使用以下步骤: 1. 导入所需的库和依赖项。使用Android Studio或其他开发环境,在项目的build.gradle文件中添加所需的库和依赖项,例如lame库和ffmpeg库。 2. 创建一个换函数。在Android应用程序的代码中,编写一个函数,该函数接受MP3文件路径作为输入,并将MP3文件换为WAV文件。 3. 解码MP3文件。使用lame库中的函数,将MP3文件解码为原始音频数据。 4. 编码WAV文件。使用ffmpeg库中的函数,将原始音频数据编码为WAV文件。 5. 保存WAV文件。将WAV文件保存到设备的特定位置,例如SD卡或应用程序的私有目录。 以下是一个简单的示例代码,用于将MP3换为WAV格式: ```java import com.github.hiteshsondhi88.libffmpeg.ExecuteBinaryResponseHandler; import com.github.hiteshsondhi88.libffmpeg.FFmpeg; import com.github.hiteshsondhi88.libffmpeg.LoadBinaryResponseHandler; import com.github.hiteshsondhi88.libffmpeg.exceptions.FFmpegNotSupportedException; import com.github.hiteshsondhi88.libffmpeg.exceptions.NoSupportedCodecException; public class MP3toWAVConverter { private FFmpeg ffmpeg; public MP3toWAVConverter() { ffmpeg = FFmpeg.getInstance(context); try { ffmpeg.loadBinary(new LoadBinaryResponseHandler() { @Override public void onStart() {} @Override public void onFailure() { // 处理FFmpeg加载失败的情况 } @Override public void onSuccess() {} @Override public void onFinish() {} }); } catch (FFmpegNotSupportedException e) { // 处理设备不支持FFmpeg的情况 } } public void convertMP3toWAV(String mp3FilePath, String wavFilePath) { String[] command = new String[]{"-i", mp3FilePath, "-acodec", "pcm_s16le", wavFilePath}; try { ffmpeg.execute(command, new ExecuteBinaryResponseHandler() { @Override public void onStart() {} @Override public void onProgress(String message) {} @Override public void onFailure(String message) { // 处理换过程中发生的错误 } @Override public void onSuccess(String message) {} @Override public void onFinish() { // 处理换完成后的操作 } }); } catch (NoSupportedCodecException | FFmpegNotSupportedException e) { // 处理换过程中发生的异常情况 } } } ``` 请注意,上述示例代码中的"com.github.hiteshsondhi88.libffmpeg"是一个第三方库,用于在Android应用程序中使用FFmpeg。确保您在项目的build.gradle文件中包含这个库的依赖项。 这只是一个基本的示例代码,实际的实现可能需要更复杂的处理,例如处理换过程中可能发生的错误和异常。另外,请确保在使用FFmpeg换文件时遵循相关的法律和知识产权规定。 ### 回答2: 要将Android上的MP3文件换为WAV格式,可以通过使用合适的音频换软件来实现。以下是一种简单的方法: 1. 在Android设备上下载并安装一个MP3WAV的应用程序,例如"MP3WAV换器"。 2. 打开应用程序,并选择要换的MP3文件。 3. 进行换设置,例如选择输出文件格式WAV,选择换的质量和比特率等。 4. 点击"换"按钮开始换过程。 5. 等待换完成,通常会有一个进度条显示换进度。 6. 换完成后,您可以在指定的输出文件夹中找到换后的WAV文件。 如果您不想使用应用程序,而是希望编程实现MP3WAV换,您可以使用Android的音频处理API来完成。您可以使用MediaCodec类来解码MP3文件,然后使用AudioTrack类将解码后的音频数据编码为WAV格式,并保存到文件中。 这是一个较为复杂的过程,需要较高的编程技能。您需要研究并了解相关的API和编程技术,以正确实现MP3WAV换功能。 无论您选择使用应用程序还是编程实现换,都应该牢记换过程可能需要消耗较多的系统资源和时间,特别是对于较大的MP3文件。 ### 回答3: Android上可以使用不同的方法将MP3文件换为WAV文件。以下是一种可行的方法: 首先,你需要在Android设备上安装一个适当的音频换应用程序,比如“MP3WAV换器”或“音频格式换器”。你可以通过在Google Play商店搜索这些应用程序来找到它们,并进行安装。 下载并安装应用程序后,你需要运行它,并选择你想要换的MP3文件。通常,应用程序会提供一个文件浏览器界面,以便你浏览并选择要换的文件。选择你的MP3文件并点击“打开”按钮。 接下来,应用程序会问你要换的文件类型。选择“WAV”作为目标文件类型,并点击“换”或“开始换”按钮。 换过程可能需要一些时间,具体取决于你的MP3文件的大小和你的设备性能。 一旦换完成,你会收到一个确认消息,将包含已成功换为WAV格式的文件的路径。你可以点击“打开文件”或类似的按钮来查看换后的WAV文件。 现在,你可以在Android设备上的任何音频播放器中播放WAV文件,以确保换的结果满足你的需求。 请注意,以上只是一种方法,具体可以根据你使用的应用程序而有所不同。还有其他的应用程序和在线工具可以用于将MP3换为WAV,你可以在网络上查找并比较它们的功能和用户评价,选择最适合你的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值