背景
在通过视频剪辑软件修改完视频之后,咱们一般会考虑如何归档资料。这其实是一件挺头疼的工作,关于一般的视频创造者来说,创造之前并不切当地知道哪些片段会被用运用上。
这种情况下,剪辑的进程,本身就是一个挑选的进程。无论是出于精选高光片段便于日后复用,还是节省存储空间的目的,这个需求都是实在存在的。
基础思路
咱们只要获取届时刻线上每个片段对应的原资料文件途径、起始方位、停止方位(或持续时刻),便能够运用东西(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 -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
参数扩展两头的规模来尽可能保存更多的视频内容。
关于归档资料这件事…
开始意识到归档资料这件事还是在「影视飓风」一期关于资料管理的视频里
其间说到软件「DAVINCI 达芬奇」具有将轨迹上未经修改的视频片段原样导出的功用。看完视频的我回想起自己从前拍照的一堆长视频资料,是删了觉得惋惜,想整理又心有余而力不足。
自那一刻起,我便思索「剪映专业版」何时才能具有这项功用?为此我还特地保存了一些草稿不舍得删除,想等这项功用落地之后,导出存档,然后再清理电脑。直到期待良久没有回应,才无法亲力亲为。好在倒也是凭借作为程序员的经验和直觉,完成了这件事。想来做的进程还是挺有趣的,甚至会联想到突“技术宅拯救世界”。
作为一个剪映深度用户,不由感慨道,尽管剪映现在开展迅猛,月活惊人,但就软件本身的基础修改能力、剪辑效率、以及稳定性方面来说,还有许多提高空间。
或许关于单纯记载日子,拍拍 vlog 的一般创造者来说,压根不会想到归档这件事。毕竟不是商业创造,没有必要做的如此仔细。但我为什么忽然执着于此呢?其实还是源自于发自内心想记载日子这件事。万一年底想剪个年度混剪,总不至于连资料都找不到嘛,对不对?