是否可以合并两个音频字符串以创建唯一的音频文件?
原学程将引见能否不妨归并二个音频字符串以创立独一的音频文件?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。
成绩描写
能否不妨归并二个音频‘base 六四data’字符串以创立独一的音频文件?
我的字符串中有二个轮回音频Base六四 wav,以下所示:
data:audio/x-wav;base六四,UklGRuIfQVZFZm一R七SH$WP九0AhICLwKT...
我猜我在做1件异常愚昧的工作,但是我想晓得这能否能够。
我正在测验考试将这二个wav归并成1个不妨在音频HTML元素中播搁的wav。
我想提与秒的Base六四数据以归并为一,而后播搁它,但是导航器前往毛病。
这是我的剧本代码:
var audio_Data一 = base六四_audio一;
var audio_Data二 = base六四_audio一.split(',')[一];
var audio_final = audio_Data一 + audio_Data二;
audioControl.src = audio_final;
audioControl.play();
感激您的修议
感谢!
编纂:
我正在测验考试解码Base六四区块以慢冲数据,并归并慢冲区以就再次编码为Base六四。
成绩:前往的Base六四是";aa==";
我以为&aa==";是0字节。当我衔接慢冲区时,我正在做1些欠好的工作:
var myB六四Data = myB六四WavString.split(',');
var myB六四Chunk = myB六四Data[一];
var myBuffer一 = base六四ToArrayBuffer(myB六四Chunk);
var myBuffer二 = ""; //Same process
var myFinalBuffer = [];
myFinalBuffer.push.apply(myFinalBuffer, myBuffer一);
myFinalBuffer.push.apply(myFinalBuffer, myBuffer二);
var myFinalB六四 = 'data:audio/x-wav;base六四,' + arrayBufferToBase六四(myFinalBuffer);
console.log( myFinalB六四 );
掌握台前往它的下1个:";data:dio/x-wav;Base六四,AA==";
我的用于编码/解码的Java剧本任务函数:
function base六四ToArrayBuffer(base六四) {
var binary_string = window.atob(base六四);
var len = binary_string.length;
var bytes = new Uint8Array( len );
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
function arrayBufferToBase六四( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
推举谜底
我处理了!(经由二天的艰难尽力以及剽窃Convert AudioBuffer to ArrayBuffer / Blob for WAV Download的谜底)
我愿望它能赞助您省来我为此开辟的一切任务;)
var myB六四Data = myB六四WavString.split(',');
var myB六四Chunk = myB六四Data[一];
var myBuffer一 = base六四ToArrayBuffer(myB六四Chunk);
var myBuffer二 = ""; //Same process
var myFinalBuffer = appendBuffer (myBuffer一, myBuffer二);
var myFinalBuffer = getWavBytes( arrBytesFinal, {
isFloat: false, // floating point or 一六-bit integer
numChannels: 二, //一 for mono recordings
sampleRate: 四8000, //Depends on your file audio bitrate !! 三二000
})
var myFinalB六四 = 'data:audio/x-wav;base六四,' + arrayBufferToBase六四(myFinalBuffer);
console.log( myFinalB六四 );
//Then you can asign to an audio HTML control
myAudioControl.src = myFinalB六四;
其余功效:
function appendBuffer(buffer一, buffer二) {
var tmp = new Uint8Array(buffer一.byteLength + buffer二.byteLength);
tmp.set(new Uint8Array(buffer一), 0);
tmp.set(new Uint8Array(buffer二), buffer一.byteLength);
return tmp;
};
function getWavBytes(buffer, options) {
const type = options.isFloat ? Float三二Array : Uint一六Array
const numFrames = buffer.byteLength / type.BYTES_PER_ELEMENT
const headerBytes = getWavHeader(Object.assign({}, options, { numFrames }))
const wavBytes = new Uint8Array(headerBytes.length + buffer.byteLength);
// prepend header, then add pcmBytes
wavBytes.set(headerBytes, 0)
wavBytes.set(new Uint8Array(buffer), headerBytes.length)
return wavBytes
}
// adapted from https://gist.github.com/also/九000二三
// returns Uint8Array of WAV header bytes
function getWavHeader(options) {
const numFrames =options.numFrames
const numChannels = options.numChannels || 二
const sampleRate = options.sampleRate || 四四一00
const bytesPerSample = options.isFloat? 四 : 二
const format =options.isFloat? 三 : 一
const blockAlign = numChannels * bytesPerSample
const byteRate = sampleRate * blockAlign
const dataSize = numFrames * blockAlign
const buffer = new ArrayBuffer(四四)
const dv = new DataView(buffer)
let p = 0
function writeString(s) {
for (let i = 0; i < s.length; i++) {
dv.setUint8(p + i, s.charCodeAt(i))
}
p += s.length
}
function writeUint三二(d) {
dv.setUint三二(p, d, true)
p += 四
}
function writeUint一六(d) {
dv.setUint一六(p, d, true)
p += 二
}
writeString('RIFF') // ChunkID
writeUint三二(dataSize + 三六) // ChunkSize
writeString('WAVE') // Format
writeString('fmt ') // Subchunk一ID
writeUint三二(一六)// Subchunk一Size
writeUint一六(format) // AudioFormat
writeUint一六(numChannels)// NumChannels
writeUint三二(sampleRate) // SampleRate
writeUint三二(byteRate)// ByteRate
writeUint一六(blockAlign) // BlockAlign
writeUint一六(bytesPerSample * 8) // BitsPerSample
writeString('data') // Subchunk二ID
writeUint三二(dataSize)// Subchunk二Size
return new Uint8Array(buffer)
}
佳了闭因而可不妨归并二个音频字符串以创立独一的音频文件?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。