亚伦影音工作室 发表于 2025-7-12 17:43

在线提取视频的音频地址

本帖最后由 亚伦影音工作室 于 2025-7-12 17:43 编辑 <br /><br /><style>
.result:not(:empty) {
        border: 1px dashed darkgray;
        padding: 12px 16px;
        margin-top: 24px;
}
</style>
<h4>1. 本地视频</h4>
<input type="file" id="file" accept="video/*">

<h4>2. 网络视频</h4>
<input type="url" id="input" placeholder="在线视频地址">

<div id="result" class="result"></div>
<script>
const handleBuffer = function (buffer, name) {
        if (/\//.test(name)) {
                name = name.split('/').slice(-1);
        }
       
        name = name.split('.');

    // 也可以直接转Blob,不过本质上还是原视频
    // const blob = new Blob(, {type: 'audio/mp3'});
    // // 使用Blob地址
    // const blobUrl = URL.createObjectURL(blob);
               
    // result.innerHTML = `<h4>试听</h4>
    //   <audio src="${blobUrl}" controls></audio>
    //   <p>点击<a href="${blobUrl}" download="${name}.mp3">这里下载音频</a>。</p>
    // `;

    // return;

       
        // 创建音频上下文
        const audioCtx = new AudioContext();
        // arrayBuffer转audioBuffer
        audioCtx.decodeAudioData(buffer, function(audioBuffer) {
                // audioBuffer就是AudioBuffer
                const blob = bufferToWave(audioBuffer, audioBuffer.sampleRate * audioBuffer.duration);
                // 使用Blob地址
      const blobUrl = URL.createObjectURL(blob);
               
                result.innerHTML = `<h4>试听</h4>
                        <audio src="${blobUrl}" controls></audio>
                        <p>点击<a href="${blobUrl}" download="${name}.wav">这里下载音频</a>。</p>
                `;
        });
};

// Convert AudioBuffer to a Blob using WAVE representation
function 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
    // "RIFF"
    setUint32(0x46464952);
    // file length - 8                     
    setUint32(length - 8);
    // "WAVE"                     
    setUint32(0x45564157);
    // "fmt " chunk
    setUint32(0x20746d66);
    // length = 16                     
    setUint32(16);
    // PCM (uncompressed)                              
    setUint16(1);
    setUint16(numOfChan);
    setUint32(abuffer.sampleRate);
    // avg. bytes/sec
    setUint32(abuffer.sampleRate * 2 * numOfChan);
    // block-align
    setUint16(numOfChan * 2);
    // 16-bit (hardcoded in this demo)
    setUint16(16);                           
    // "data" - chunk
    setUint32(0x61746164);
    // chunk length                  
    setUint32(length - pos - 4);                  

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

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

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

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

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

file.onchange = function (event) {
    const file = event.target.files;
    // 开始识别
    const reader = new FileReader();
    reader.onload = function (event) {
      const arrBuffer = event.target.result;
      handleBuffer(arrBuffer, file.name);
    };
    reader.readAsArrayBuffer(file);
       
        // 显示loading
        result.innerHTML = '<ui-loading></ui-loading>';
};

input.onchange = function () {
        if (this.matches(':invalid')) {
                new LightTip('请输入合法的URL地址', 2000, 'error');
               
                return;       
        }
       
        const url = this.value.trim();
       
        if (!url) {
                return;       
        }
       
        result.innerHTML = '<ui-loading></ui-loading>';
       
        fetch(url).then(res => res.arrayBuffer()).then(buffer => {
                handleBuffer(buffer, url);       
        });
};

</script>

杨帆 发表于 2025-7-12 18:49

谢谢亚伦老师,若可用就太好了!

试了一下,没反应呀

比如:https://www.douyin.com/jingxuan?modal_id=7514600436411043108

杨帆 发表于 2025-7-12 18:52

本地视频可以,谢谢老师{:4_190:}

亚伦影音工作室 发表于 2025-7-12 18:57

杨帆 发表于 2025-7-12 18:49
谢谢亚伦老师,若可用就太好了!

试了一下,没反应呀


后缀不对。

杨帆 发表于 2025-7-12 19:07

亚伦影音工作室 发表于 2025-7-12 18:57
后缀不对。

明白了,谢谢老师{:4_190:}

红影 发表于 2025-7-12 19:22

我也随便找了个视频,好像不行,也是格式的缘故吧。
这个好,感谢亚伦老师带来的好东西{:4_187:}

红影 发表于 2025-7-12 19:24

好东西置顶了,省得不小心被压到下面去了{:4_204:}

老谟深虑 发表于 2025-7-14 18:32

          这个很有用,谢谢老师,收藏了。

老谟深虑 发表于 2025-7-14 19:19

          请问老师,到哪里可以找到后缀是mp4的网络视频地址?
页: [1]
查看完整版本: 在线提取视频的音频地址