diff --git a/public/examples/mirror.json b/public/examples/mirror.json new file mode 100644 index 0000000..23770e4 --- /dev/null +++ b/public/examples/mirror.json @@ -0,0 +1,381 @@ +{ + "nodes": [ + { + "id": "ba50174d-7567-4911-8935-075ded3f65ac", + "type": "ffmpeg", + "data": { + "name": "punch.mp4", + "url": "/punch.mp4", + "ext": "mp4", + "outputs": [ + "v", + "a" + ], + "inputs": [], + "nodeType": "input" + }, + "nodeType": "input", + "position": { + "x": 0, + "y": 10 + }, + "positionAbsolute": { + "x": 0, + "y": 10 + }, + "width": 109, + "height": 54, + "dragging": false + }, + { + "id": "ab3ea91a-c1b7-494e-b9a9-535e34f37a8e", + "type": "ffmpeg", + "data": { + "name": "out.mp4", + "ext": "mp4", + "inputs": [ + "v", + "a" + ], + "outputs": [], + "nodeType": "output" + }, + "nodeType": "output", + "position": { + "x": 630, + "y": 10 + }, + "positionAbsolute": { + "x": 630, + "y": 10 + }, + "width": 90, + "height": 54, + "dragging": false + }, + { + "id": "1e7a29cf-4b6f-49a0-a6d2-5e990f314b8e", + "type": "ffmpeg", + "data": { + "id": 367, + "meta": "...", + "name": "split", + "type": "V->N", + "description": "Pass on the input to N video outputs.", + "inputs": [ + "v" + ], + "outputs": [ + "v", + "v" + ], + "params": [ + { + "name": "outputs", + "type": "int", + "desc": "set number of outputs (from 1 to INT_MAX) (default 2)", + "min": 1, + "max": 2000, + "default": 2, + "value": 2 + } + ], + "nodeType": "filter" + }, + "nodeType": "filter", + "position": { + "x": 80, + "y": -100 + }, + "positionAbsolute": { + "x": 80, + "y": -100 + }, + "width": 59, + "height": 50, + "dragging": false + }, + { + "id": "4ed67545-efaa-4344-ab1c-23f96d43b40a", + "type": "ffmpeg", + "data": { + "id": 244, + "meta": "TS.", + "name": "hflip", + "type": "V->V", + "description": "Horizontally flip the input video.", + "inputs": [ + "v" + ], + "outputs": [ + "v" + ], + "params": [], + "nodeType": "filter" + }, + "nodeType": "filter", + "position": { + "x": 170, + "y": -190 + }, + "positionAbsolute": { + "x": 170, + "y": -190 + }, + "width": 59, + "height": 50, + "dragging": false + }, + { + "id": "87d1cfd4-afae-4f37-8ab9-ec4384415c96", + "type": "ffmpeg", + "data": { + "id": 249, + "meta": ".S.", + "name": "hstack", + "type": "N->V", + "description": "Stack video inputs horizontally.", + "inputs": [ + "v", + "v" + ], + "outputs": [ + "v" + ], + "params": [ + { + "name": "inputs", + "type": "int", + "desc": "set number of inputs (from 2 to INT_MAX) (default 2)", + "min": 2, + "max": 2000, + "default": 2, + "value": 2 + }, + { + "name": "shortest", + "type": "boolean", + "desc": "force termination when the shortest input terminates (default false)", + "min": null, + "max": null, + "default": "false", + "value": "false" + } + ], + "nodeType": "filter" + }, + "nodeType": "filter", + "position": { + "x": 250, + "y": -90 + }, + "positionAbsolute": { + "x": 250, + "y": -90 + }, + "width": 59, + "height": 50, + "dragging": false + }, + { + "id": "cf20cf34-ceed-412b-a814-056ad327b1ff", + "type": "ffmpeg", + "data": { + "id": 367, + "meta": "...", + "name": "split", + "type": "V->N", + "description": "Pass on the input to N video outputs.", + "inputs": [ + "v" + ], + "outputs": [ + "v", + "v" + ], + "params": [ + { + "name": "outputs", + "type": "int", + "desc": "set number of outputs (from 1 to INT_MAX) (default 2)", + "min": 1, + "max": 2000, + "default": 2, + "value": 2 + } + ], + "nodeType": "filter" + }, + "nodeType": "filter", + "position": { + "x": 330, + "y": -160 + }, + "positionAbsolute": { + "x": 330, + "y": -160 + }, + "width": 59, + "height": 50, + "dragging": false + }, + { + "id": "c7a52d98-7e33-4aa6-86e8-da6efb01a054", + "type": "ffmpeg", + "data": { + "id": 399, + "meta": "T..", + "name": "vflip", + "type": "V->V", + "description": "Flip the input video vertically.", + "inputs": [ + "v" + ], + "outputs": [ + "v" + ], + "params": [], + "nodeType": "filter" + }, + "nodeType": "filter", + "position": { + "x": 460, + "y": -190 + }, + "positionAbsolute": { + "x": 460, + "y": -190 + }, + "width": 59, + "height": 50, + "dragging": false + }, + { + "id": "00094660-b592-41d6-a0c9-8165d5c3c57c", + "type": "ffmpeg", + "data": { + "id": 405, + "meta": ".S.", + "name": "vstack", + "type": "N->V", + "description": "Stack video inputs vertically.", + "inputs": [ + "v", + "v" + ], + "outputs": [ + "v" + ], + "params": [ + { + "name": "inputs", + "type": "int", + "desc": "set number of inputs (from 2 to INT_MAX) (default 2)", + "min": 2, + "max": 2000, + "default": 2, + "value": 2 + }, + { + "name": "shortest", + "type": "boolean", + "desc": "force termination when the shortest input terminates (default false)", + "min": null, + "max": null, + "default": "false", + "value": "false" + } + ], + "nodeType": "filter" + }, + "nodeType": "filter", + "position": { + "x": 540, + "y": -70 + }, + "positionAbsolute": { + "x": 540, + "y": -70 + }, + "width": 59, + "height": 50, + "dragging": false + } + ], + "edges": [ + { + "id": "2358d0de-d9f2-4b79-b099-bf6034c06749", + "type": "default", + "source": "ba50174d-7567-4911-8935-075ded3f65ac", + "target": "1e7a29cf-4b6f-49a0-a6d2-5e990f314b8e", + "sourceHandle": "v_0", + "targetHandle": "v_0" + }, + { + "id": "f816ee38-6755-4c4c-9c93-86ee93102079", + "type": "default", + "source": "ba50174d-7567-4911-8935-075ded3f65ac", + "target": "ab3ea91a-c1b7-494e-b9a9-535e34f37a8e", + "sourceHandle": "a_1", + "targetHandle": "a_1" + }, + { + "id": "b798b4e8-d43a-470e-ae8f-890d4b50bb89", + "type": "default", + "source": "1e7a29cf-4b6f-49a0-a6d2-5e990f314b8e", + "target": "4ed67545-efaa-4344-ab1c-23f96d43b40a", + "sourceHandle": "v_0", + "targetHandle": "v_0" + }, + { + "source": "4ed67545-efaa-4344-ab1c-23f96d43b40a", + "sourceHandle": "v_0", + "target": "87d1cfd4-afae-4f37-8ab9-ec4384415c96", + "targetHandle": "v_0", + "id": "xyflow__edge-4ed67545-efaa-4344-ab1c-23f96d43b40av_0-87d1cfd4-afae-4f37-8ab9-ec4384415c96v_0" + }, + { + "source": "1e7a29cf-4b6f-49a0-a6d2-5e990f314b8e", + "sourceHandle": "v_1", + "target": "87d1cfd4-afae-4f37-8ab9-ec4384415c96", + "targetHandle": "v_1", + "id": "xyflow__edge-1e7a29cf-4b6f-49a0-a6d2-5e990f314b8ev_1-87d1cfd4-afae-4f37-8ab9-ec4384415c96v_1" + }, + { + "source": "87d1cfd4-afae-4f37-8ab9-ec4384415c96", + "sourceHandle": "v_0", + "target": "cf20cf34-ceed-412b-a814-056ad327b1ff", + "targetHandle": "v_0", + "id": "xyflow__edge-87d1cfd4-afae-4f37-8ab9-ec4384415c96v_0-cf20cf34-ceed-412b-a814-056ad327b1ffv_0" + }, + { + "source": "cf20cf34-ceed-412b-a814-056ad327b1ff", + "sourceHandle": "v_0", + "target": "c7a52d98-7e33-4aa6-86e8-da6efb01a054", + "targetHandle": "v_0", + "id": "xyflow__edge-cf20cf34-ceed-412b-a814-056ad327b1ffv_0-c7a52d98-7e33-4aa6-86e8-da6efb01a054v_0" + }, + { + "source": "00094660-b592-41d6-a0c9-8165d5c3c57c", + "sourceHandle": "v_0", + "target": "ab3ea91a-c1b7-494e-b9a9-535e34f37a8e", + "targetHandle": "v_0", + "id": "xyflow__edge-00094660-b592-41d6-a0c9-8165d5c3c57cv_0-ab3ea91a-c1b7-494e-b9a9-535e34f37a8ev_0" + }, + { + "source": "cf20cf34-ceed-412b-a814-056ad327b1ff", + "sourceHandle": "v_1", + "target": "00094660-b592-41d6-a0c9-8165d5c3c57c", + "targetHandle": "v_0", + "id": "xyflow__edge-cf20cf34-ceed-412b-a814-056ad327b1ffv_1-00094660-b592-41d6-a0c9-8165d5c3c57cv_0" + }, + { + "source": "c7a52d98-7e33-4aa6-86e8-da6efb01a054", + "sourceHandle": "v_0", + "target": "00094660-b592-41d6-a0c9-8165d5c3c57c", + "targetHandle": "v_1", + "id": "xyflow__edge-c7a52d98-7e33-4aa6-86e8-da6efb01a054v_0-00094660-b592-41d6-a0c9-8165d5c3c57cv_1" + } + ], + "command": "ffmpeg -i punch.mp4 -filter_complex \"[0:v]split[1][7];[1]hflip[2];[2][7]hstack,split[9][11];[9]vflip[10];[11][10]vstack[out_v]\" -map \"[out_v]\" -map 0:a out.mp4" +} \ No newline at end of file diff --git a/src/App.svelte b/src/App.svelte index cbd833a..79d8009 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -30,6 +30,7 @@ { name: "Speed Up", url: "/examples/speedup.json" }, { name: "Slow Down Smoothly", url: "/examples/smooth_slow.json" }, { name: "Video Grid", url: "/examples/grid.json" }, + { name: "Mirror", url: "/examples/mirror.json" }, ]; let videoValue = "/" + $inputs[0].name;