音频流转mp3格式
function convertToMp3(wavDataView) {
// 获取wav头信息
const wav = lamejs.WavHeader.readHeader(wavDataView);
const { channels, sampleRate } = wav;
const mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128);
// 获取左右通道数据
const result = recorder.getChannelData();
const buffer = [];
const leftData = result.left && new Int16Array(result.left.buffer, 0, result.left.byteLength / 2);
const rightData = result.right && new Int16Array(result.right.buffer, 0, result.right.byteLength / 2);
const remaining = leftData.length + (rightData ? rightData.length : 0);
const maxSamples = 1152;
for (let i = 0; i < remaining; i += maxSamples) {
const left = leftData.subarray(i, i + maxSamples);
let right = null;
let mp3buf = null;
if (channels === 2) {
right = rightData.subarray(i, i + maxSamples);
mp3buf = mp3enc.encodeBuffer(left, right);
} else {
mp3buf = mp3enc.encodeBuffer(left);
}
if (mp3buf.length > 0) {
buffer.push(mp3buf);
}
}
const enc = mp3enc.flush();
if (enc.length > 0) {
buffer.push(enc);
}
let blob = new Blob(buffer, {
type: "audio/mp3",
});
return blob;
}
获取 Gop 大小(关键帧间隔)
<script src="https://j.weizan.cn/zhibo/js/jquery-2.1.4.min.js"></script>
$.ajax({
url: video_src, // 视频播放地址
dataType: "TEXT",
success: (res) => {
// 解析 m3u8
var m3u8list = res.replace(/\n/g, '<br>').split('<br>');
// 获取 Gop 大小
var gopSize = parseInt(m3u8list[3].split(':').pop());
console.log('gop size:' + gopSize);
}
})