Node.js: 是否可以根据 start/stop 时间戳从更广泛的视频文件中提取子剪辑?

Node.js: Is it possible to extract sub-clips from a broader video file based on start/stop time stamps?

我有一个流程,iOS 应用程序用户将录制一个大视频文件并将其上传到我们的服务器。事实上,用户可能希望根据特定时间戳提取较大视频的某些部分,并生成可以在 iOS 设备上本地查看和共享的精彩片段。

作为一名 FE 开发人员,我什至不知道从哪里开始。我们的 BE 将在 NodeJS 中构建。在我看来,这应该是一个比较简单的问题来解决,但我不知道。

是否有使电影操作变得容易的 API?我可以根据开始和停止时间轻松提取剪辑并将其另存为单独的文件吗?这些是昂贵的任务吗?或者还不错?

我猜对这个调用的响应将是一系列文件名的列表,这些文件名是由于生成这些剪辑而生成的,然后 iOS 应用程序可以下拉并加载。

它并不像看起来那么简单,因为视频文件的结构非常结构化,包含 header 信息并索引到各个视频和音频轨道和帧中。任何拆分或裁剪都需要考虑到这一点,并创建具有正确 headers 和索引等的新文件。

幸运的是,确实有一些库可用于执行此类操作,其中最强大的库之一是 ffmpeg。

有些项目允许以编程方式使用 ffmpeg 命令行工具 - 这种方法的优点是您可以利用 ffmpeg 命令行的庞大社区知识库。

nodejs 的一个流行的是:

然后您可以查看 ffmpeg 文档或社区答案以找到您需要的特定功能 - 例如按照您的要求在开始和结束时间裁剪视频:

总体思路很简单,格式如下:

ffmpeg -i yourInputVideo.mp4 -ss 01:30:00 -to 02:30:00 -c copy copy yourNewOutputVideo.mp4

值得看看 ffmpeg 在线文档 (https://ffmpeg.org/ffmpeg.html) 中的搜索信息,以帮助理解示例,尤其是上面的第二个示例:

-ss position (input/output) When used as an input option (before -i), seeks in this input file to position. Note that in most formats it is not possible to seek exactly, so ffmpeg will seek to the closest seek point before position. When transcoding and -accurate_seek is enabled (the default), this extra segment between the seek point and position will be decoded and discarded. When doing stream copy or when -noaccurate_seek is used, it will be preserved.

When used as an output option (before an output url), decodes but discards input until the timestamps reach position.

position must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.