如何通过API或JS组合视频和音频?

时间:2015-03-06 00:13:02

标签: javascript ruby-on-rails http audio video

我正在设计一个执行以下操作的系统:

  1. 用户上传视频,JS代码查找视频的长度。

  2. 对已存在的服务执行HTTP调用以检索相同长度的音轨。

  3. 同步并合并音频和视频(长度完全相同)。我能想到的最好的事情就是同时播放它们(完全可以使用HTML5),但我希望能够让用户下载一个组合文件,或者能够说...将它上传到YouTube通过他们的API。

  4. 我一直在做大量的谷歌搜索,到目前为止还没有找到任何可能做到这一点的服务或代码。

    我熟悉JavaScript,Ruby on Rails,HTML,CSS,jQuery以及AngularJS和Backbone.js。如果其中一种语言中存在解决方案,或者我可以通过HTTP访问某些内容,那将是非常棒的。

3 个答案:

答案 0 :(得分:3)

我目前正在使用 FFmpeg.wasm。这是一个很棒的工具,但我还没有找到一种用纯 JavaScript 来做到这一点的方法,因为音频和视频有时具有不同的编解码器。我做了一个函数来合并视频并返回一个 Uint8Array,它可以在 blob 中使用。

<script src='https://unpkg.com/@ffmpeg/ffmpeg@0.9.6/dist/ffmpeg.min.js'></script>
async function mergeVideo(video, audio) {
    let { createFFmpeg, fetchFile } = FFmpeg;
    let ffmpeg = createFFmpeg();
    await ffmpeg.load();
    ffmpeg.FS('writeFile', 'video.mp4', await fetchFile(video));
    ffmpeg.FS('writeFile', 'audio.mp4', await fetchFile(audio));
    await ffmpeg.run('-i', 'video.mp4', '-i', 'audio.mp4', '-c', 'copy', 'output.mp4');
    let data = await ffmpeg.FS('readFile', 'output.mp4');
    return new Uint8Array(data.buffer);
};

答案 1 :(得分:2)

你可以试试videoconverter.js,我之前没试过,  但我认为这是现在唯一能做到前端的方法......而最小的缩小版也需要6.1 MB。

另一个选择是将视频上传到您的服务器,使用ffmpeg合并它,并为用户提供输出文件的链接,以便下载或流式传输。

答案 2 :(得分:0)

关于带有音频的 svc,请考虑 youtube 音乐/youtube api。它将提供您需要的所有曲目。只是不要忘记版权。但是,无论您走到哪里,都会遇到这个问题。