背景

在通过视频剪辑软件修改完视频之后,咱们一般会考虑如何归档资料。这其实是一件挺头疼的工作,关于一般的视频创造者来说,创造之前并不切当地知道哪些片段会被用运用上。

这种情况下,剪辑的进程,本身就是一个挑选的进程。无论是出于精选高光片段便于日后复用,还是节省存储空间的目的,这个需求都是实在存在的。

基础思路

咱们只要获取届时刻线上每个片段对应的原资料文件途径、起始方位、停止方位(或持续时刻),便能够运用东西(FFmpeg)进行剪切导出。

运用 FFmpeg 无损导出剪映轨迹视频片段

草稿文件解析

On MacOS

草稿文件名称为 draft_info.json,坐落

/Users/user/Movies/JianyingPro/User Data/Projects/com.lveditor.draft

On Windows

草稿文件名称为 draft_content.json,坐落

C:UsersuserAppDataLocalJianyingProUser DataProjectscom.lveditor.draft

文件结构

读取文件信息,调查结构能够发现以下关键信息

{
  "materials": {
    "videos": [
      {
        "id": "ED9E7016-7A4D-4251-804F-2EBCAE19BC25",
        "path": "##_draftpath_placeholder_[草稿ID]_##/materials/video/C0631.MP4"
      },
      {
        "id": "2F408BAD-5031-4CC8-942D-DDAFD71B2A92",
        "path": "/Users/xxx/Desktop/videos/C0631.MP4"
      }
    ]
  },
  "tracks": [
    {
      "type": "video",
      "segments": [
        {
          "material_id": "ED9E7016-7A4D-4251-804F-2EBCAE19BC25",
          "source_timerange": {
            "duration": 833333,
            "start": 1350000
          }
        }
      ]
    }
  ]
}

其间 materials 字段记载了一切资料的基本信息,比较关键的主要是文件寄存方位;而 tracks 字段记载了轨迹信息,咱们能够从中找到对应的视频片段(segment),然后获取到片段的时刻规模信息。

通过 ID 的映射,咱们能够获取到:文件地址、开端时刻,持续时刻,然后就能够开端编写导出逻辑了。

需求注意的是 ##_draftpath_placeholder_xxx_## 字样代表的是草稿文件夹本身的方位,因而在处理时需求做替换。

凭借 FFmpeg 导出

FFmpeg 是一个十分强壮的跨平台流媒体处理程序,并且是开源的。一起作为指令行东西,它能够轻易地集成到脚本和程序中,作为底层东西支撑上层运用。

咱们的项目正是一个根据 FFmpeg 的简单包装,因为运转时需求调用它,因而你需求提早装置 ffmpeg并将指令加入到环境(PATH)中。

Tips: 在 MacOS 中你能够通过 brew install ffmpeg 快捷地完成装置,其他方法详见官网

完整项目的地址见 Github – emosheeep/capcut-export,运转起来大概是下面这样:

Usage: ccexp [options] <file> [output]
Export video clips from CapCut editor tracks, helps archive materials.
Arguments:
  file                      CapCut/Jianying draft info json file.
  output                    The output directory, default is cwd.
Options:
  -V, --version             output the version number
  -p,--concurrent <number>  The number of tasks processed in parallel, the default is number of CPU.
  --offset <number>         Expand the video clips' time range to both sides for about specific seconds, default is 2s.
  --verbose                 To be verbose. (default: false)
  -h, --help                display help for command

运用 FFmpeg 无损导出剪映轨迹视频片段

接下来咱们介绍 ffmpeg 指令的基础用法:

ffmpeg -ss 2 -t 3 -c copy -y -i /path/to/input.mp4 /path/to/output.mp4

在上面的指令中:

  • -ss 代表设置起始方位为 2s 处

  • -t 代表导出片段的持续时刻为 3s

  • -c copy 指定运用流式仿制的方法拷贝原视频。流式仿制不会对原视频重新解码和编码,因而它是无损的,也正因没有这个进程,它的速度也快很多。

  • -y 主动同意指令运转进程中需求确认的流程。主要是同意在存在同名文件时执行覆盖操作。

所以这行指令翻译过来就是:导出原视频从 2s 处开端,持续 3s 的片段到指定方位

为什么觉得导出视频的时刻规模不那么准确?

在运用 FFmpeg 进行视频剪辑或者截取的时候,可能会呈现时刻规模不精准的情况,有两个主要原因:

视频关键帧(Keyframes)

关键帧是能够彻底独立于其他帧进行解码的帧,一般每几秒视频就会有一个关键帧。FFmpeg 运用 -ss 选项跳动到特定的时刻方位,默认情况下,它会跳动到最近的关键帧。假如你选定的开端时刻点并没有关键帧,FFmpeg 就会挑选最近的前一个关键帧作为开端点,这样就可能形成精度问题。

假如你想准确地指定开端时刻,则需求将 -ss 参数放到 -i 参数之后。但这种做法同样会面对一些问题:

  • 流式仿制截取:虽是无损画质,但在视频开端方位可能有会短暂的黑屏问题。原因正是上面说到的关键帧选取问题,你选定的时刻点没有关键帧,或对应的帧无法独自解码。

  • 不运用流式仿制:将会存在解码和重编码问题,耗时较长不说,还可能形成画质的丢失。

相比之下,画质的保存更为重要,关于时刻点不准确的问题,在上面的东西中,能够通过操控 offset 参数扩展两头的规模来尽可能保存更多的视频内容。

关于归档资料这件事…

开始意识到归档资料这件事还是在影视飓风」一期关于资料管理的视频里

运用 FFmpeg 无损导出剪映轨迹视频片段

其间说到软件「DAVINCI 达芬奇」具有将轨迹上未经修改的视频片段原样导出的功用。看完视频的我回想起自己从前拍照的一堆长视频资料,是删了觉得惋惜,想整理又心有余而力不足

自那一刻起,我便思索「剪映专业版」何时才能具有这项功用?为此我还特地保存了一些草稿不舍得删除,想等这项功用落地之后,导出存档,然后再清理电脑。直到期待良久没有回应,才无法亲力亲为。好在倒也是凭借作为程序员的经验和直觉,完成了这件事。想来做的进程还是挺有趣的,甚至会联想到突“技术宅拯救世界”。

作为一个剪映深度用户,不由感慨道,尽管剪映现在开展迅猛,月活惊人,但就软件本身的基础修改能力、剪辑效率、以及稳定性方面来说,还有许多提高空间。

或许关于单纯记载日子,拍拍 vlog 的一般创造者来说,压根不会想到归档这件事。毕竟不是商业创造,没有必要做的如此仔细。但我为什么忽然执着于此呢?其实还是源自于发自内心想记载日子这件事。万一年底想剪个年度混剪,总不至于连资料都找不到嘛,对不对?