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

我想做个网站怎么做的网站域名重要吗

我想做个网站怎么做的,网站域名重要吗,软件工程很难学吗,廊坊市做网站需求 开始录音——监听录音数据——结束录音 在监听录音数据过程中#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.hkea.cn/news/14591954/

相关文章:

  • windows 做网站服务器wordpress strip_tags utf8
  • 制作网站的发展前景vue可以做pc端网站
  • dede网站 设置404 错误页面动漫制作专业专升本考什么专业
  • 专业网站优化价格大连网站建设价格
  • 关于设计方面的网站深圳网站建设评价
  • wordpress站迁移后速度慢163企业邮箱入口官网
  • 网站开发模块域名申请后怎么建网站
  • 合肥地区建网站公司环保网站建设公司哪家好
  • 怎么样给公司做网站展览公司
  • 建设一个电商网站需要多少钱做网站销售那里找客户
  • 如何做国外网站北京seo百科
  • 网上开的公司网站打不开手机网站域名哪里注册
  • 胶南市城乡建设局网站开发一个手机app成本费用
  • 网站内链是什么 怎么做做推广必须知道的网站吗
  • 自己做的网站如何上线2345网址导航手机上网导航下载
  • 东游科技网站建设appstore官网入口
  • wordpress集成微博登录网站系统优化
  • 网站建设技术服务协议青海住房和城乡建设厅网站
  • 中国建设监理协会网站投稿网站手机端 怎么做
  • 江门网站建设外包外贸营销词
  • 网站建设需要集齐哪5份资料品牌建设的预期成果
  • 静海网站建设公司怎么设计自己logo图片
  • 网站后台编辑器内容不显示国内室内设计师排名
  • 养猪网站建设规划书三亚网上商城
  • 做百度推广需要网站吗淄博做淘宝网站
  • 建设户外腰包网站万网虚拟主机做网站教程
  • wordpress面页模板下长沙优化排名
  • 珠海网站设计培训班如何做设计师个人网站
  • 案例 网站商业计划书ppt免费模板下载
  • 成都学校网站建设企业广州建筑公司实力排名