Javicle - a JSON Video Composition Language
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 5.6 KiB

4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
4 vuotta sitten
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. START=10
  10. END=130
  11. INCR=10
  12. for ((i=START;i<END;i=(i+INCR))); do
  13. ffmpeg -i $i /tmp/my/source.mp4 -ss $((i)) -t $((i+INCR)) /tmp/my/slice_$((i))_$((i+INCR)).mp4
  14. done
  15. ```
  16. With JVCL, you'd create this spec:
  17. ```json
  18. {
  19. "assets": [ {"name": "src", "path": "/tmp/my/source.mp4"} ],
  20. "operations": [{
  21. "operation": "split",
  22. "creates": "src_splits",
  23. "perform": {
  24. "split": "src",
  25. "interval": "10s",
  26. "start": "10s",
  27. "end": "130s"
  28. }
  29. }]
  30. }
  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. If you like CLIs, JVCL might be for you.
  44. You might enjoy JVCL if your video composition needs are relatively simple or
  45. if you enjoy capturing repeatable processes in source control.
  46. # Concepts
  47. In JVCL there are two main concepts: assets and operations.
  48. ## Assets
  49. Assets are the inputs: generally image, audio and video files. Assets have a name and a path.
  50. The path can be a file or a URL.
  51. ## Operations
  52. Operations are transformations to perform on the inputs.
  53. An operation can produce a new intermediate asset.
  54. Intermediate assets have names, and special paths that indicate how to reconstruct them from their assets, such that if you have the path of an intermediate asset, you can recreate its content, assuming you supply the same input assets.
  55. The operations that JVCL either supports or intends to support are:
  56. ### split
  57. Split an audio/video asset into multiple assets
  58. ### concat
  59. Concatenate audio/video assets together into one asset
  60. ### trim
  61. Trim audio/video - crop from beginning, end, or both
  62. ### overlay
  63. Overlay one video file onto another
  64. ### ken-burns
  65. For transforming still images into video via a fade-pan (aka Ken Burns) effect
  66. ### letterbox
  67. 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
  68. ### split-silence
  69. Split an audio file according to silence
  70. # Complex Example
  71. Here is a complex example using multiple assets and operations:
  72. ```json
  73. {
  74. "assets": [
  75. {"name": "vid1", "path": "/tmp/path/to/video1.mp4"},
  76. {"name": "vid2", "path": "/tmp/path/to/video2.mp4"}
  77. ],
  78. "operations": [
  79. {
  80. "operation": "split", // name of the operation
  81. "creates": "vid1_split_%", // assets it creates, the '%' will be replaced with a counter
  82. "perform": {
  83. "split": "vid1", // split this source asset
  84. "interval": "10s" // split every ten seconds
  85. }
  86. },
  87. {
  88. "operation": "concat", // name of the operation
  89. "creates": "recombined_vid1", // assets it creates, the '%' will be replaced with a counter
  90. "perform": {
  91. "concat": ["vid1_split"] // recombine all split assets
  92. }
  93. },
  94. {
  95. "operation": "concat", // name of the operation
  96. "creates": "combined_vid", // asset it creates, can be referenced later
  97. "perform": {
  98. "concat": ["vid1", "vid2"] // operation-specific: this says, concatenate these named assets
  99. }
  100. },
  101. {
  102. "operation": "concat", // name of the operation
  103. "creates": "combined_vid", // the asset it creates, can be referenced later
  104. "perform": {
  105. "concat": ["vid1", "vid2"] // operation-specific: this says, concatenate these named assets
  106. }
  107. },
  108. {
  109. "operation": "overlay", // name of the operation
  110. "creates": "overlay1", // asset it creates
  111. "perform": {
  112. "source": "combined_vid1", // main video asset
  113. "overlay": "vid1", // overlay this video on the main video
  114. "start": "vid1.end_ts", // when (on the main video timeline) to start the overlay. default is 0 (beginning)
  115. "duration": "vid1.duration", // how long to play the overlay. default is to play the entire overlay asset
  116. "width": 400, // how wide the overlay will be, in pixels. default is "overlay.width"
  117. "height": 300, // how tall the overlay will be, in pixels. default is "overlay.height"
  118. "x": "source.width / 2", // horizontal overlay position. default is 0
  119. "y": "source.height / 2", // vertical overlay position. default is 0
  120. "out": "1080p", // this is a shortcut to the two lines below, and is the preferred way of specifying the output resolution
  121. "out_width": 1920, // output width in pixels. default is source width
  122. "out_height": 1024 // output height in pixes. default is source height
  123. }
  124. }
  125. ]
  126. }
  127. ```