Javicle - a JSON Video Composition Language
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
4 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # Javicle - a JSON Video Composition Language
  2. JVCL (pronounced "Javicle") is a JSON DSL for audio/video transformations.
  3. Under the hood, it's all shell commands: `ffmpeg`, `mediainfo`, `sox`, and so on.
  4. JVCL provides higher-level semantics for working with these lower level tools.
  5. # A Quick Example
  6. Say you want to split a portion of a video into ten-second chunks. With ffmpeg
  7. and bash, you might do something like this:
  8. ```shell script
  9. INCR=10
  10. for ((i=10;i<130;i=(i+INCR))); do
  11. ffmpeg -i /tmp/my/source.mp4 -ss ${i} -t $((i+INCR)) /tmp/my/slice_${i}_$((i+INCR)).mp4
  12. done
  13. ```
  14. With JVCL, you'd write this spec file:
  15. ```json
  16. {
  17. "assets": [ {"name": "src", "path": "/tmp/my/source.mp4"} ],
  18. "operations": [{
  19. "operation": "split",
  20. "creates": "src_split_files",
  21. "split": "src",
  22. "interval": "10s",
  23. "start": "10s",
  24. "end": "130s"
  25. }]
  26. }
  27. ```
  28. and then run it like this:
  29. ```shell script
  30. jvcl my-spec.json
  31. ```
  32. Yes, the JVCL is longer, but I think many would agree it is easier to read and maintain.
  33. **As the number of input assets and operations grows, hand-crafted shell scripts with magical
  34. ffmpeg incantations become ever more inscrutable.**
  35. JVCL is designed for readability and maintainability. JVCL will continue to evolve towards greater
  36. coverage of the full capabilities of ffmpeg. We also plan to introduce "function" concepts
  37. to create reusable compound operations, further increasing reusability and lowering long-term
  38. maintenance.
  39. # Who is JVCL not for?
  40. If you like GUIs, JVCL is probably not for you.
  41. JVCL is not a replacement for Final Cut Pro or even iMovie.
  42. # Who is JVCL for?
  43. JVCL is for people who like CLIs and automation.
  44. JVCL is for people with relatively simple video composition needs (for now),
  45. since the range of operations supported is limited.
  46. # Concepts
  47. In JVCL there are a few main concepts: spec files, assets and operations.
  48. ## JVCL Spec Files
  49. A JVCL spec file is just a regular JSON file that happens to contain a single JSON object,
  50. whose properties are `assets` and `operations`.
  51. When you run `jvcl` on a spec file, it will load the `assets`, then perform the `operations` in order.
  52. Unlike most JSON, comments *are* allowed in JVCL spec files:
  53. * A line comment starts with `//` and continue to the end of the line
  54. * A multi-line block syntax starts with `/*` and ends with `*/`
  55. ## Assets
  56. Assets are the inputs: generally image, audio and video files. Assets have a name and a path.
  57. The path can be a file or a URL.
  58. Input assets are defined using the `assets` array of a JVCL spec.
  59. Operations produce one or more assets, as specified in the `creates` property of
  60. an operation JSON object.
  61. ### Asset Properties
  62. Assets expose properties that can be referenced in operations. The properties currently exposed are:
  63. * `duration`: duration of the audio/video in seconds (audio and video assets only)
  64. * `width`: width of the video in pixels (video and image assets only)
  65. * `height`: width of the video in pixels (video and image assets only)
  66. ## Operations
  67. Operations are transformations to perform on the inputs.
  68. An operation can produce one or more new assets, which can then be referenced in
  69. later operations.
  70. Most of the operation settings can be JavaScript expressions, for example:
  71. "startTime": "someAsset.duration - 10"
  72. The above would set the `startTime` value to ten seconds before the end of `someAsset`.
  73. ### Supported Operations
  74. Today, JVCL supports these operations:
  75. ### split
  76. Split an audio/video asset into multiple assets
  77. ### concat
  78. Concatenate audio/video assets together into one asset
  79. ### trim
  80. Trim audio/video; crop a section of an asset, becomes a new asset
  81. ### overlay
  82. Overlay one audio or video file onto another
  83. ### ken-burns
  84. For transforming still images into video via a fade-pan (aka Ken Burns) effect
  85. ### letterbox
  86. Transform a video in one size to another size using black letterboxes on the sides or top/bottom. Handy for embedding mobile videos into other screen formats
  87. ### split-silence
  88. Split an audio file according to silence
  89. # Complex Example
  90. Here is a complex example using multiple assets and operations.
  91. ```json
  92. {
  93. "assets": [
  94. // file -- will be referenced directory
  95. {
  96. "name": "vid1",
  97. "path": "/tmp/path/to/video1.mp4"
  98. },
  99. // URL -- will be downloaded to scratch directory and referenced from there
  100. {
  101. "name": "vid2",
  102. "path": "https://archive.org/download/gov.archives.arc.1257628/gov.archives.arc.1257628_512kb.mp4"
  103. },
  104. // URL -- will be downloaded to `dest` directory and referenced from there
  105. {
  106. "name": "vid3",
  107. "path": "https://archive.org/download/gov.archives.arc.49442/gov.archives.arc.49442_512kb.mp4",
  108. "dest": "src/test/resources/sources/"
  109. }
  110. ],
  111. "operations": [
  112. {
  113. "operation": "split", // name of the operation,
  114. "creates": "vid1_split_%", // assets it creates, the '%' will be replaced with a counter
  115. "split": "vid1", // split this source asset
  116. "interval": "10s" // split every ten seconds
  117. },
  118. {
  119. "operation": "concat", // name of the operation,
  120. "creates": "recombined_vid1", // assets it creates, the '%' will be replaced with a counter
  121. "concat": ["vid1_split"] // recombine all split assets
  122. },
  123. {
  124. "operation": "concat", // name of the operation,
  125. "creates": "combined_vid", // asset it creates, can be referenced later
  126. "concat": ["vid1", "vid2"] // operation-specific: this says, concatenate these named assets
  127. },
  128. {
  129. "operation": "concat", // name of the operation,
  130. "creates": "combined_vid", // the asset it creates, can be referenced later
  131. "concat": ["vid1", "vid2"] // operation-specific: this says, concatenate these named assets
  132. },
  133. {
  134. "operation": "overlay", // name of the operation,
  135. "creates": {
  136. "name": "overlay1", // asset it creates
  137. "width": "1920", // output width in pixels. default is source width
  138. "height": "1024" // output height in pixes. default is source height
  139. },
  140. "main": "combined_vid1", // main video asset
  141. "startTime": "30", // when (on the main video timeline) to begin showing the overlay. default is 0 (beginning)
  142. "endTime": "60", // when (on the main video timeline) to stop showing the overlay. default is to play the entire overlay
  143. "overlay": {
  144. "source": "vid2", // overlay this video on the main video
  145. "startTime": "0", // when (on the overlay video timeline) to begin playback on the overlay. default is 0 (beginning)
  146. "endTime": "overlay.duration", // when (on the overlay video timeline) to end playback on the overlay. default is to play the entire overlay
  147. "width": "overlay.width / 2", // how wide the overlay will be, in pixels. default is the full overlay width, or maintain aspect ratio if height was set
  148. "height": "source.height", // how tall the overlay will be, in pixels. default is the full overlay height, or maintain aspect ratio if width was set
  149. "x": "source.width / 2", // horizontal overlay position on main video. default is 0
  150. "y": "source.height / 2" // vertical overlay position on main video. default is 0
  151. }
  152. }
  153. ]
  154. }
  155. ```
  156. ## What's up with the name?
  157. I dunno, a cross between a javelin and an icicle? does that have any positive connotations? ok then...