편집식은 node.js 및 ffmpeg를 사용하여 선언 NLE ( 비선형 비디오 편집 )을위한 도구 및 프레임 워크입니다. 편집식을 사용하면 부드러운 전환과 음악 오버레이드로 클립, 이미지, 오디오 및 타이틀 세트 에서 비디오를 쉽고 프로그래밍 방식으로 만들 수 있습니다.
편집식에는 클립이나 이미지 세트에서 비디오를 빠르게 조립하기위한 간단한 CLI가 있거나보다 유연한 JavaScript API를 사용할 수 있습니다.
FFMPEG-CONCAT에서 영감을 얻은 편집식은 스트리밍 편집을 사용하기 때문에 훨씬 빠르며 스토리지가 많이 필요하지 않습니다. 편집식은 매우 확장 가능하고 새로운 동적 컨텐츠를 추가하기위한 플러그 가능한 인터페이스가 풍부한 기능을 목표로합니다.

이 GIF / YouTube는 "Editly CommonFeatures.json5"라는 명령으로 작성되었습니다. 여기에서 더 많은 예를보십시오.
duration 마다 cutFrom / cutTo 세그먼트 길이와 일치하도록 비디오 속도 업 / 속도를 자동으로 속도Video must be 1337x1000 30fps 불평하는 경우)예를 참조하십시오
ffmpeg (및 ffprobe )가 설치되어 PATH 에 사용 가능합니다 npm i -g editly
editly --help 사용을 위해 help
오디오 트랙을 사용하여 비디오, 이미지 및 텍스트에서 간단한 무작위 비디오 편집을 만듭니다.
editly
title: ' My video '
clip1.mov
clip2.mov
title: ' My slideshow '
img1.jpg
img2.jpg
title: ' THE END '
--fast
--audio-file-path /path/to/music.mp3또는 JSON 또는 JSON5 편집 사양에서 MP4 (또는 GIF)를 만듭니다 (JSON5는보다 사용자 친화적 인 JSON 형식입니다) :
editly my-spec.json5 --fast --keep-source-audio --out output.gifJSON 편집 사양을 만드는 방법의 예는 아래 또는 예를 참조하십시오.
--fast 없으면 첫 번째 입력 비디오의 너비 , 높이 및 프레임 속도를 사용하는 것이 기본값입니다. 다른 모든 클립은 이러한 차원으로 변환됩니다. 물론 이러한 매개 변수 중 일부 또는 전부를 무시할 수 있습니다.
--audio-file-path 가리키십시오. 라이센스를 존중하십시오! import editly from 'editly' ;
// See editSpec documentation
await editly ( editSpec ) 편집 사양은 다음 구조로 전체 편집 작업을 설명하는 JavaScript / JSON 객체입니다.
{
outPath ,
width ,
height ,
fps ,
allowRemoteRequests : false ,
defaults : {
duration : 4 ,
transition : {
duration : 0.5 ,
name : 'random' ,
audioOutCurve : 'tri' ,
audioInCurve : 'tri' ,
} ,
layer : {
fontPath ,
// ...more layer defaults
} ,
layerType : {
'fill-color' : {
color : '#ff6666' ,
}
// ...more per-layer-type defaults
} ,
} ,
clips : [
{
transition ,
duration ,
layers : [
{
type ,
// ...more layer-specific options
}
// ...more layers
] ,
}
// ...more clips
] ,
audioFilePath ,
loopAudio : false ,
keepSourceAudio : false ,
clipsAudioVolume : 1 ,
outputVolume : 1 ,
audioTracks : [
{
path ,
mixVolume : 1 ,
cutFrom : 0 ,
cutTo ,
start : 0 ,
} ,
// ...more audio tracks
] ,
audioNorm : {
enable : false ,
gaussSize : 5 ,
maxGain : 30 ,
}
// Testing options:
enableFfmpegLog : false ,
verbose : false ,
fast : false ,
}| 매개 변수 | CLI 동등한 | 설명 | 기본 | |
|---|---|---|---|---|
outPath | --out | 출력 경로 (MP4, MKV)도 .gif 일 수도 있습니다 | ||
width | --width | 모든 미디어가 변환 될 폭 | 640 | |
height | --height | 모든 미디어가 변환 될 높이 | 첫 번째 비디오 의 width 및 종횡비를 기준으로 자동 | |
fps | --fps | 모든 비디오가 변환 될 FPS | 첫 번째 비디오 FPS 또는 25 | |
customOutputArgs | FFMPEG에 대한 사용자 정의 출력 코덱/형식 인수 지정 (예제 참조) | 자동 (H264) | ||
allowRemoteRequests | --allow-remote-requests | 원격 URL을 경로로 허용하십시오 | false | |
fast | --fast , -f | 빠른 모드 (낮은 해상도 및 FPS, 빠른 미리보기를 얻는 데 유용합니다 ⏩) | false | |
defaults.layer.fontPath | --font-path | 기본 글꼴을 .ttf로 설정하십시오 | 시스템 글꼴 | |
defaults.layer.* | 모든 레이어가 상속하는 모든 레이어 매개 변수를 설정하십시오 | |||
defaults.duration | --clip-duration | 자체 지속 시간이없는 클립의 기본 클립 기간 설정 | 4 | 비서 |
defaults.transition | 기본 전환을 설명하는 개체 { name, duration } . 전환을 비활성화하기 위해 NULL 로 설정하십시오 | |||
defaults.transition.duration | --transition-duration | 기본 전환 기간 | 0.5 | 비서 |
defaults.transition.name | --transition-name | 기본 전환 유형. 전환 유형을 참조하십시오 | random | |
defaults.transition.audioOutCurve | 오디오 크로스에서 기본 페이드 아웃 곡선 | tri | ||
defaults.transition.audioInCurve | 오디오 크로스에서 곡선의 기본 페이드 페이드 | tri | ||
clips[] | 순서대로 재생 될 클립 개체 목록. 각 클립에는 하나 이상의 레이어가있을 수 있습니다. | |||
clips[].duration | 클립 기간. defaults.duration 참조하십시오. 설정이 없으면 클립 기간은 첫 번째 비디오 계층 의 클립 기간이됩니다. | defaults.duration | ||
clips[].transition | 이 클립의 끝 에서 전환을 지정하십시오. defaults.transition 참조하십시오 | defaults.transition | ||
clips[].layers[] | 자연 순서로 오버레이 될 현재 클립 내의 레이어 목록 (상단의 최종 레이어) | |||
clips[].layers[].type | 레이어 유형, 아래를 참조하십시오 | |||
clips[].layers[].start | 클립에 몇시 에이 레이어가 시작되어야합니다 | 비서 | ||
clips[].layers[].stop | 클립에 몇시 에이 레이어가 멈춰야합니다 | 비서 | ||
audioTracks[] | 임의의 오디오 트랙 목록. 오디오 트랙을 참조하십시오. | [] | ||
audioFilePath | --audio-file-path | 전체 비디오의 오디오 트랙을 설정하십시오. 오디오 트랙도 참조하십시오 | ||
loopAudio | --loop-audio | 비디오보다 짧은 경우 오디오 트랙을 루프합니까? | false | |
keepSourceAudio | --keep-source-audio | 소스 오디오를 clips 에서 유지 하시겠습니까? | false | |
clipsAudioVolume | audioTracks 에 대한 clips 의 오디오 볼륨. 오디오 트랙을 참조하십시오. | 1 | ||
outputVolume | --output-volume | 출력 볼륨 조정 (최종 단계). 예를 참조하십시오 | 1 | 예를 들어 0.5 또는 10dB |
audioNorm.enable | 오디오 정규화를 활성화 하시겠습니까? 오디오 정규화를 참조하십시오. | false | ||
audioNorm.gaussSize | 오디오 정규화 가우스 크기. 오디오 정규화를 참조하십시오. | 5 | ||
audioNorm.maxGain | 오디오 정규화 최대 게인. 오디오 정규화를 참조하십시오. | 30 |
transition.name 은 GL-Transitions 또는 다음 중 하나 일 수 있습니다 : directional-left , directional-right , directional-up , directional-down , random 또는 dummy .
예와 commonfeatures.json5를 참조하십시오
비디오 레이어의 경우 부모 clip.duration 지정되면 clip.duration 과 일치하도록 비디오의 속도가 느려집니다. cutFrom / cutTo 설정되면 결과 세그먼트 ( cutTo cutFrom )의 속도가 느려지고 clip.duration 에 맞습니다. 레이어에 오디오가 있으면 보관됩니다 (그리고 존재하는 경우 다른 오디오 계층과 혼합됩니다.)
| 매개 변수 | 설명 | 기본 | |
|---|---|---|---|
path | 비디오 파일로가는 길 | ||
resizeMode | 크기 조정 모드를 참조하십시오 | ||
cutFrom | 절단 할 시간 값 | 0 | 비서 |
cutTo | 절단 할 시간 값 | 비디오의 끝 | 비서 |
width | 스크린 너비에 대한 너비 | 1 | 0 ~ 1 |
height | 스크린 높이에 대한 높이 | 1 | 0 ~ 1 |
left | 스크린 너비에 대한 X- 위치 | 0 | 0 ~ 1 |
top | 스크린 높이에 대한 y 위치 | 0 | 0 ~ 1 |
originX | X 앵커 | left | left 또는 right |
originY | y 앵커 | top | top 또는 bottom |
mixVolume | 이 비디오의 오디오 트랙을 다른 사람과 믹싱 할 때 상대 볼륨 | 1 |
오디오 레이어가 함께 혼합됩니다. cutFrom / cutTo 설정되면 결과 세그먼트 ( cutTo cutFrom )의 속도가 느려지고 clip.duration 에 맞습니다. 속도 저하/속도 업 작동은 0.5x 에서 100x 사이의 값으로 제한됩니다.
| 매개 변수 | 설명 | 기본 | |
|---|---|---|---|
path | 오디오 파일로가는 길 | ||
cutFrom | 절단 할 시간 값 | 0 | 비서 |
cutTo | 절단 할 시간 값 | clip.duration | 비서 |
mixVolume | 이 오디오 트랙을 다른 사람들과 혼합 할 때 상대 볼륨 | 1 |
이것은 전 세계 시작 시간을 계산하지 않고도 clips 시작 시간에 비해 오디오를보다 쉽게 시작할 수있는 audioTracks 의 특별한 경우입니다.
detached-audio start 시간이 클립의 시작과 관련이 있다는 것을 제외하고 오디오 트랙과 동일한 속성을 가지고 있습니다.
분리 된 오디오 트랙의 예
전체 화면 이미지
| 매개 변수 | 설명 | 기본 | |
|---|---|---|---|
path | 이미지 파일로가는 길 | ||
resizeMode | 크기 조정 모드를 참조하십시오 |
또한 Ken Burns 매개 변수를 참조하십시오.
화면의 사용자 정의 위치와 크기로 이미지 오버레이. 참고 : 애니메이션 GIF를 사용하려면 대신 video 사용하십시오.
| 매개 변수 | 설명 | 기본 | |
|---|---|---|---|
path | 이미지 파일로가는 길 | ||
position | 위치 매개 변수를 참조하십시오 | ||
width | 너비 (0 ~ 1) 여기서 1은 화면 너비입니다. | ||
height | 높이 (0 ~ 1) 여기서 1은 화면 높이입니다. |
Ken Burns 매개 변수도 참조하십시오.
fontPath defaults.layer.fontPath 를 참조하십시오text - 제목 텍스트 표시, 짧게 유지하십시오textColor 기본 #ffffffposition - 위치 매개 변수를 참조하십시오Ken Burns 매개 변수도 참조하십시오
fontPath defaults.layer.fontPath 를 참조하십시오text - 표시 할 자막 텍스트textColor 기본 #ffffff 배경이있는 제목
text - 유형 title 참조하십시오textColor 유형 title 참조하십시오background - { type, ... } -유형 radial-gradient , linear-gradient 또는 fill-color 참조fontPath 유형 title 참조하십시오 fontPath defaults.layer.fontPath 를 참조하십시오texttextColor 기본 #ffffffbackgroundColor 기본 #d02a42position - 위치 매개 변수를 참조하십시오 fontPath defaults.layer.fontPath 를 참조하십시오textfontSizecharSpacingcolorposition - 위치 매개 변수를 참조하십시오 color - 배경을 채우는 색상, 기본값 : 무작위 화 colors - 두 가지 색상 배열, 기본값 : 무작위 colors - 두 가지 색상 배열, 기본값 : 무작위 ?
CustomCanvas.js를 참조하십시오
func 사용자 정의 JavaScript 함수 CustomFabric.js를 참조하십시오
func 사용자 정의 JavaScript 함수 GLSL 셰이더를로드합니다. gl.json5 및 Rainbow-Colors.frag를 참조하십시오
fragmentPathvertexPath (선택 사항) audioTracks 속성에는 선택적으로 최종 비디오에서 임의의 시간에 시작할 수있는 오디오 트랙을 지정하는 객체 목록이 포함될 수 있습니다. 이 트랙은 함께 혼합됩니다 ( mixVolume 각 트랙이 다른 트랙과 비교되는 상대 숫자를 지정합니다). clips 의 오디오는 audioTracks 과 별도로 혼합되므로 clipsAudioVolume audioTracks 의 각 오디오 트랙 의 볼륨에 비해 clips 에서 결합 된 오디오의 볼륨을 지정합니다.
| 매개 변수 | 설명 | 기본 | |
|---|---|---|---|
audioTracks[].path | 이 트랙의 파일 경로 | ||
audioTracks[].mixVolume | 이 트랙의 상대 볼륨 | 1 | |
audioTracks[].cutFrom | 소스 파일을 절단 하는 시간 값 | 0 | 비서 |
audioTracks[].cutTo | 소스 파일을 절단 하는 시간 값 | 비서 | |
audioTracks[].start | 이 오디오 트랙을 시작하기 위해 비디오에 몇 초 동안 | 0 | 비서 |
audioTracks 과 레이어 유형 '오디오' 의 차이점은 audioTracks 여러 clips 에서 계속 재생되며 필요할 때마다 시작하고 멈출 수 있다는 것입니다.
audioTracks 예제를 참조하십시오
레이어 유형 'Detached-Audio' 도 참조하십시오.
최종 출력 오디오의 오디오 정규화를 활성화 할 수 있습니다. 이것은 오디오 오리를 달성하려는 경우 유용합니다 (예 : 음성이 말할 때 다른 모든 트랙의 자동으로 더 적게 볼 수 있습니다).
audioNorm 매개 변수는 여기에 문서화되어 있습니다.
오디오 덕킹의 예
resizeMode 이미지를 화면에 장착하는 방법. 다음 중 하나 일 수 있습니다.
contain - 모든 비디오는 프레임 내에 포함되며 레터 박스가 포함됩니다.contain-blur - 추 contain 과 같은 모습이지만 레터 박스로 사본이 흐려집니다.cover - 비디오 전체 화면을 덮기 위해 자르기 (종횡비 보존)stretch - 비디오가 전체 화면을 덮기 위해 늘어납니다 (종횡비 무시). 기본 contain-blur .
보다:
특정 레이어는 위치 매개 변수를 지원합니다
position 중 하나 일 수 있습니다.
top , bottom center , top-left , top-right , center-left , center-right , bottom-left , bottom-right{ x, y, originX = 'left', originY = 'top' } , 여기서 { x: 0, y: 0 } 은 화면의 왼쪽 상단이고 { x: 1, y: 1 } 은 오른쪽 하단, x 는 비디오 너비에 비해 비디오 높이에서 y 높이입니다. originX 와 originY 선택 사항이며 객체의 위치 원점 (앵커 위치)을 지정합니다.position.json5를 참조하십시오
| 매개 변수 | 설명 | 기본 | |
|---|---|---|---|
zoomDirection | Ken Burns 효과의 방향 줌 효과 : in , out , left , right 또는 null 비활성화합니다. | ||
zoomAmount | Ken Burns 효과의 줌 금액 | 0.1 |
이를 통해 시스템에 대한 모든 적절한 버전의 종속성을 얻는 것에 대해 걱정하지 않고 컨테이너화 된 CLI로 편리하게 사용하는 데 도움이됩니다.
$ git clone https://github.com/mifi/editly.git
$ cd editly/examples
$ git clone https://github.com/mifi/editly-assets.git assets
$ cd ..
$ docker-compose up
$ docker-compose run editly bash -c " cd examples && editly audio1.json5 --out /outputs/audio1.mp4 "
$ docker cp editly:/outputs/audio1.mp4 . Error: The specified module could not be found. , try : npm un -g editly && npm i -g --build-from-source editly ( #15 참조)/bin/sh: pkg-config: command not found 최신 node.js lts 버전을 사용해보십시오. 이 프로젝트는 저만 유지됩니다. 이 프로젝트는 항상 무료 및 오픈 소스로 유지되지만 유용하다면 저를 지원하는 것을 고려하십시오. :) 그것은 그것을 개선하기위한 추가 동기를 줄 것입니다.
PayPal
이 패키지는 모든 기고자와 스폰서의 지원과 도움 없이는 존재하지 않습니다!
특별한 감사 :
여기에서 편집식으로 만든 비디오 나 프로젝트를 공유하려면 PR 제출하십시오.
❤️으로 만들어 졌습니까 ??
mifi.no의 더 많은 앱
더 멋진 콘텐츠를 위해 Github, YouTube, IG, Twitter에서 나를 팔로우하십시오!