当前位置: 首页 > news >正文

my网站域名镇江网站推广

my网站域名,镇江网站推广,丰台网站制作,兰州网站设计厂家需求 开始录音——监听录音数据——结束录音 在监听录音数据过程中#xff1a;客户端每100ms给前端传输一次数据#xff08;pcm数据转成base64#xff09;#xff0c;前端需要将base64片段解码、合并、添加WAV头、转成File、上传到 OSS之后将 url 给到服务端处理。 {num…需求 开始录音——监听录音数据——结束录音 在监听录音数据过程中客户端每100ms给前端传输一次数据pcm数据转成base64前端需要将base64片段解码、合并、添加WAV头、转成File、上传到 OSS之后将 url 给到服务端处理。 {numberOfChannels: 1, // 声道数// sampleRate: 16000, // 采样率sampleRate: 44100, // 更改采样率为 44100 HzbitsPerChannel: 16, // 位深format: PCM, }概念 pcm是原始音频mac上可以使用audacity软件播放pcm原始音频文件 base64编码将二进制编码成文本格式 atob 将二进制转为 unicode 字符序列charCodeAt 获取每个字符的unicode编码 Uint8Array 是包含8位一个字节的无符号整数序列用于处理二进制数据 ArrayBuffer 在内存中分配一段连续的空间存储二进制数据如数字、图像、音频文件等 new Blob([wavHeader, pcmData], { type: ‘audio/wav’ }); 给PCM数据添加wav头信息 Blob 是浏览器内部生成的二进制数据包括数据和类型信息 File 是 Blob 的子类除了数据和类型信息还包括文件名和最后修改时间通常表示用户从本地文件系统选择的文件 将base64片段转为WAV文件 /*** 将base64片段转为WAV文件* param base64Segments* returns*/ export function base64ToAudio(base64Segments) {// 合并PCM数据const pcmData mergeBase64SegmentsIntoPCM(base64Segments);// 创建WAV头const dataLength pcmData.length;const wavHeader createWavHeader(dataLength, 44100);// 合并WAV文件头和PCM数据const blob new Blob([wavHeader, pcmData], { type: audio/wav });const file new File([blob], output.wav, { type: audio/wav });return file; }将一系列Base64编码的音频段合并成一个PCM数据流 /*** 将一系列Base64编码的音频段合并成一个PCM数据流* param segments 包含Base64编码音频段的数组* returns*/ function mergeBase64SegmentsIntoPCM(segments) {let mergedData new Uint8Array();segments.forEach((base64Segment) {const binarySegment atob(base64Segment);const binaryArray new Uint8Array(binarySegment.length);for (let i 0; i binarySegment.length; i) {binaryArray[i] binarySegment.charCodeAt(i);}mergedData mergeArrays(mergedData, binaryArray);});// 合并后的PCM数据return mergedData; }合并两个TypedArray类型化数组 /*** 合并两个TypedArray类型化数组* param segments* returns*/ function mergeArrays(a, b) {// 类型化数组确保类型一致const c new a.constructor(a.length b.length);// 类型化数组的set方法直接在底层内存中操作不需要逐个元素拷贝效率高c.set(a, 0);// 保障合并后的数组在内存中是连续的提高访问速度c.set(b, a.length);return c; }创建一个WAV文件的头部信息 /*** 创建一个WAV文件的头部信息* 包含了RIFF格式标识、文件大小、WAVE标识、格式子块fmt的ID和大小、音频格式、* 声道数、采样率、字节率、块对齐、每样本位数以及数据子块data的ID和大小* param dataSize 文件大小* param sampleRate 采样率* returns*/ function createWavHeader(dataSize, sampleRate) {// 创建一个大小为44字节的ArrayBuffer用于存储WAV文件头const buffer new ArrayBuffer(44);// 创建一个DataView用于操作buffer中的数据const view new DataView(buffer);view.setUint32(0, 0x52494646, false); // 设置Chunk ID为RIFFview.setUint32(4, dataSize 36, true); // 设置文件大小不包括前8个字节view.setUint32(8, 0x57415645, false); // 设置格式标识为WAVEview.setUint32(12, 0x666d7420, false); // 设置第一个子块ID为fmt view.setUint32(16, 16, true); // 设置第一个子块大小为16字节view.setUint16(20, 1, true); // 设置音频格式为PCM1表示PCMview.setUint16(22, 1, true); // 设置声道数单声道为1view.setUint32(24, sampleRate, true); // 设置采样率view.setUint32(28, sampleRate * 2, true); // 设置字节率采样率 * 每帧字节数view.setUint16(32, 2, true); // 设置每帧字节数块对齐view.setUint16(34, 16, true); // 设置每样本位数view.setUint32(36, 0x64617461, false); // 设置第二个子块ID为dataview.setUint32(40, dataSize, true); // 设置第二个子块大小即音频数据大小// 返回填充了WAV文件头信息的bufferreturn buffer; } 异步获取音频文件的时长 /*** 异步获取音频文件的时长* param file 音频文件* returns 返回音频的时长秒*/ export const getAudioDuration async (file) {try {const audio new Audio(URL.createObjectURL(file));await new Promise((resolve) (audio.onloadedmetadata resolve));const { duration } audio;return duration;} catch (error) {console.error(获取音频时长时发生错误:, error);return 0;} };将文件上传到oss export const uploadFile (data: UploadTokenData, file: File) {console.log(uploadFile开始了, data, , file);const bodyFormData new FormData();const url ${data.host}/${data.dir}${file.name};bodyFormData.append(OSSAccessKeyId, data.accessId);bodyFormData.append(policy, data.policy);bodyFormData.append(signature, data.signature);bodyFormData.append(key, ${data.dir}${file.name});bodyFormData.append(dir, data.dir);bodyFormData.append(success_action_status, 200);bodyFormData.append(file, file);console.log(uploadFile上传的url: , url);return new Promise((resolve, reject) {const xhr new XMLHttpRequest();xhr.onerror function error(e) {console.log(upload error, e);reject(e);};xhr.onload async () {// allow success when 2xx status see https://github.com/react-component/upload/issues/34if (xhr.status 200 || xhr.status 300) {reject(上传异常);}console.log(upload success);resolve({...data,ossUrl: url,});};xhr.open(post, data.host, true);xhr.setRequestHeader(X-Requested-With, XMLHttpRequest);xhr.send(bodyFormData);}); };
http://www.pierceye.com/news/916763/

相关文章:

  • 做外汇网站卖判刑多少年如何找回网站后台密码
  • 怎么做优惠券网站asp.net mvc 5网站开发之美
  • 网站底部浮动电话广告福建住房和城乡建设部网站
  • 建站之星破解版wordpress 置顶排序
  • c2c网站代表和网址涟源市建设局网站
  • 哪个网站有免费的模板免费网上商城系统
  • 一个网站的建设需要什么东西前十强排名家装公司
  • 广州网站建设报价表石家庄搜索排名提升
  • 网站备案步骤企业网站手机版模板免费下载
  • 郑州高端品牌网站建设镇江网站营销推广
  • 网站开发简单的框架南昌手机网站
  • 网站分析与优化百度新闻源网站有哪些
  • 直播网站开发秀色上海综合新闻
  • 电子商务网站建设与管理课后题答案企业网站推广哪家好
  • 网站被挂黑链怎么删除石家庄企业网站建设
  • 网站模板怎么连接域名可视化网页设计在线
  • 美术馆网站建设要求开发软件多少钱一个月
  • 直播网站开发核心技术wordpress访问次数插件
  • wap网站 劣势微信小程序怎么写
  • 商业网站开发与设计网站seo是什么意思
  • 内蒙古住房和城乡建设网站做网站的人怎么上传内容的
  • 视频网站视频预览怎么做的美丽说网站案例分析
  • 宝安多屏网站建设公司好吗网站启用cdn加速
  • 上海网站制作方法网站页面设计报价
  • 介绍自己做的网站的论文网站模块建设中
  • 诸城手机网站建设微官网怎么制作
  • 做网站界面的软件网站开发售后服务
  • 织梦可以做英文网站吗成交型网站建设公司
  • 长沙招聘网站制作广告设计公司需要用专线网吗
  • 一级做爰A视频免费网站国内疫苗接种率