当前位置: 网站首页>小程序开发>小程序制作

淮滨小程序制作【淮滨企业邮箱】淮滨网站外包、淮滨微信商城开发、淮滨网店美工、淮滨淘宝设计

发表日期: 2021-05-10 15:08:25 浏览次数:124

淮滨小程序制作【淮滨企业邮箱】淮滨网站外包、淮滨微信商城开发、淮滨网店美工、淮滨淘宝设计

网站建设.jpg

淮滨县,河南省信阳市下辖县,位于信阳市东北部,地处东经115°11′—115°35,北纬32°15′—32°38'之间,总面积1209平方公里,地处北亚热带与暖温带气候过渡地带。 [1]  截至2020年6月,淮滨县辖4个街道、5个镇、10个乡, [2]  县政府驻滨湖街道。 [3]  截至2019年末,淮滨县总人口78.47万。 [4] 

淮滨因位于淮河之滨而得名。1952年8月经国务院批准,正式设立淮滨县。 [1]  1962年10月20日,合并于息县的原淮滨行政区域和固始县的原淮滨县期思、张庄两个区的行政区域为淮滨县的行政区域。 [5]  2019年3月,淮滨县入选第一批革命文物保护利用片区分县名单。 [6]  淮滨县产业集聚区是河南省首批确定的175个产业集聚区之一。造船业是淮滨县传统优势产业,也是纳入河南省“十一五”规划予以重点支持的装备制造业。 [7]  2020年2月26日,河南省人民政府批准淮滨县退出贫困县,正式脱贫摘帽。 [8]  淮滨县境内有期思古城、东西湖风景区、淮滨淮南湿地自然保护区等著名景点。

2019年,淮滨县生产总值225.92亿元,增长7.9%。其中,第一产业增加值41.26亿元,增长1.8%;第二产业增加值91.70亿元,增长8.9%;第三产业增加值92.97亿元,增长10.7%,三次产业结构18.3:40.6:41.1。 [4] 


本文接上文,是音视频处理专题文章,上节说了视频上传截取封面。本文介绍音频上传。(最近发现张鑫旭大神也更新了类似文章,本文借鉴其文章,作为音频上传专题文章)

原理

其实音频截取原理也是ArrayBuffer转AudioBuffer 然后创建一个空的AudioBuffer,复制现有的通道数据前3秒的数据,然后复制的内容写入到这个空的AudioBuffer,于是我们就得到了一个剪裁后的音频Buffer数据了。

案例

HTML代码:

<form>
    <input type="file" id="file" accept="audio/mpeg"></form><p><audio id="audio" controls></audio></p>

js 代码:

file.onchange = function (event) {
    var target = event.target;
    var file = target.files[0];
    var type = file.type;
    // 开始识别
    var reader = new FileReader();
    reader.onload = function (event) {
        var arrBuffer = event.target.result;

        var audioCtx = new AudioContext();

        audioCtx.decodeAudioData(arrBuffer, function(audioBuffer) {
            var duration = audioBuffer.duration;
            var channels = audioBuffer.numberOfChannels;
            var rate = audioBuffer.sampleRate;

            // 3秒
            var startOffset = 0;
            var endOffset = rate * 3;
            var frameCount = endOffset - startOffset;
            var newAudioBuffer;

            newAudioBuffer = new AudioContext().createBuffer(channels, endOffset - startOffset, rate);
            var anotherArray = new Float32Array(frameCount);
            var offset = 0;

            for (var channel = 0; channel < channels; channel++) {
                audioBuffer.copyFromChannel(anotherArray, channel, startOffset);
                newAudioBuffer.copyToChannel(anotherArray, channel, offset);
            }/**
* 直接播放使用下面的代码
// 创建AudioBufferSourceNode对象
var source = audioCtx.createBufferSource();
// 设置AudioBufferSourceNode对象的buffer为复制的3秒AudioBuffer对象
source.buffer = newAudioBuffer;
// 这一句是必须的,表示结束,没有这一句没法播放,没有声音
// 这里直接结束,实际上可以对结束做一些特效处理
source.connect(audioCtx.destination);
// 资源开始播放
source.start();
*/

            var blob = bufferToWave(newAudioBuffer, frameCount);/**
* 转换成Base64使用下面的代码
var reader2 = new FileReader();
reader2.onload = function(evt){
    audio.src = evt.target.result;
};
reader2.readAsDataURL(blob);
*/
            // 使用Blob地址
            audio.src = URL.createObjectURL(blob);
        });
    };
    reader.readAsArrayBuffer(file);};// Convert AudioBuffer to a Blob using WAVE representationfunction bufferToWave(abuffer, len) {
    var numOfChan = abuffer.numberOfChannels,
    length = len * numOfChan * 2 + 44,
    buffer = new ArrayBuffer(length),
    view = new DataView(buffer),
    channels = [], i, sample,
    offset = 0,
    pos = 0;

    // write WAVE header
    setUint32(0x46464952);                         // "RIFF"
    setUint32(length - 8);                         // file length - 8
    setUint32(0x45564157);                         // "WAVE"

    setUint32(0x20746d66);                         // "fmt " chunk
    setUint32(16);                                 // length = 16
    setUint16(1);                                  // PCM (uncompressed)
    setUint16(numOfChan);
    setUint32(abuffer.sampleRate);
    setUint32(abuffer.sampleRate * 2 * numOfChan); // avg. bytes/sec
    setUint16(numOfChan * 2);                      // block-align
    setUint16(16);                                 // 16-bit (hardcoded in this demo)

    setUint32(0x61746164);                         // "data" - chunk
    setUint32(length - pos - 4);                   // chunk length

    // write interleaved data
    for(i = 0; i < abuffer.numberOfChannels; i++)
        channels.push(abuffer.getChannelData(i));

    while(pos < length) {
        for(i = 0; i < numOfChan; i++) {             // interleave channels
            sample = Math.max(-1, Math.min(1, channels[i][offset])); // clamp
            sample = (0.5 + sample < 0 ? sample * 32768 : sample * 32767)|0; // scale to 16-bit signed int
            view.setInt16(pos, sample, true);          // write 16-bit sample
            pos += 2;
        }
        offset++                                     // next source sample
    }

    // create Blob
    return new Blob([buffer], {type: "audio/wav"});

    function setUint16(data) {
        view.setUint16(pos, data, true);
        pos += 2;
    }

    function setUint32(data) {
        view.setUint32(pos, data, true);
        pos += 4;
    }}


淮滨小程序制作淮滨企业邮箱淮滨网站外包、淮滨微信商城开发、淮滨网店美工、淮滨淘宝设计

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: http://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878