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

16
我正在设计一个系统,它有以下功能:
  1. 用户上传一个视频, JS代码查找视频的长度。

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

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

我一直在进行大量的谷歌搜索,迄今为止还没有找到任何可以完成此项任务的服务或代码。

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


1
定义:我想要做的就是能够添加音轨到视频中,替换掉原有的(如果有的话)。 - Buddy Lamers
1
我的帖子因某些原因被踩了,但除非你计划像Uber一样扩展规模,否则不使用YouTube API是愚蠢的。此外,这里是一个“Youtube音频剥离器”(MP4转MP3)的Github源代码,它是使用Elektron(一个跨平台javascript框架)构建的。所以,如果你选择这条路,那么你的项目的大致设计/可行性阶段已经完成了。 - Nate T
3个回答

6

我目前正在使用 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);
};

谢谢您的回答。你在合并视频方面遇到过任何问题吗? - Crashalot
不,我在合并视频方面没有任何问题。 - myjobistobehappy
感谢您的快速回复。所以您遇到的唯一问题就是将音频添加到视频中?现在开始研究这个项目,了解其优点和缺点非常有帮助。 - Crashalot
如何将n个视频合并且不包含音频?这是否可行? - Time Buy
你是如何在原生JS中进行合并的? - SpikeThea

4

你可以尝试使用 videoconverter.js 进行转换,虽然我之前没有尝试过,但我认为这是目前唯一的前端方法...而最小化后的版本也需要6.1 MB。

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


1
当您遵循这个(通常良好的)使用videoconverter.js的答案时,请注意两件事:1)该项目已经在GitHub上未维护了五年以上。2)FFmpeg是LGPL,当在服务器上使用时不是问题(因为托管不构成在GPL术语中的分发/传达),但在前端可能会有所不同(因为下载JavaScript是分发/传达)。 - Clemens Kofler

0
关于带音频的svc,可以考虑使用YouTube音乐/YouTube API。它将提供您所需的所有曲目。只是不要忘记版权问题。然而,这是您无论走到哪里都会遇到的问题。

1
我相信这个API会让你根据曲目长度进行搜索,但你需要在这里查看详细信息:https://developers.google.com/youtube/v3。 - Nate T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接