Programmatically create an OSP file

The library that powers Openshot 2.0

Moderators: Andy, Cenwen, beats

Programmatically create an OSP file

Postby Piper984 » Mon Nov 14, 2016 10:58 pm

Hello,

I have a need where I'd like to dynamically create an OpenShot project file, where this project file would then be opened with the OpenShot Editor via a shell command so that the user can further refine the video editing session and render out a video file. This dynamically created OSP file would have some media assets included in the Projects Files area, as well as some video/audio clips established on the timeline control.

Is this a feature of libopenshot? From the examples I've look at, I haven't seen methods to create and save projects? Perhaps I have been looking in the wrong place?

Thanks for any help or advice!
Piper984
New member
 
Posts: 3
Joined: Mon Nov 14, 2016 10:47 pm

Re: Programmatically create an OSP file

Postby XXLRay » Thu Nov 17, 2016 8:09 pm

You can save projects and select encoding options on export. I am not sure what you are missing.
XXLRay
OpenShot Veteran
 
Posts: 1064
Joined: Fri Jul 06, 2012 4:10 pm

Re: Programmatically create an OSP file

Postby Piper984 » Sat Dec 03, 2016 3:38 am

Hi XXLRay,

Well what I am wanting to do is create an .osp file programmatically. The user would then export the video once he/she has arranged the clips and transitions.

If you look at an .osp file saved from version 2.1 of OpenShot, you'll see a pretty wicked huge JSON document. For example, below is an .osp file where I just imported a clip (Sintel trailer) and then inserted the clip at 0:0.

Code: Select all
{
    "channel_layout": 3,
    "channels": 2,
    "clips": [
        {
            "alpha": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "anchor": 0,
            "channel_filter": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "channel_mapping": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "crop_height": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "crop_width": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "crop_x": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 0.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "crop_y": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 0.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "duration": 52.0,
            "effects": [],
            "end": 52,
            "file_id": "JV8ZDDZ8IT",
            "gravity": 4,
            "has_audio": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "has_video": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "id": "8VSFH9LNTQ",
            "image": "../.openshot_qt/thumbnail/JV8ZDDZ8IT.png",
            "layer": 4,
            "location_x": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 0.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "location_y": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 0.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "perspective_c1_x": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "perspective_c1_y": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "perspective_c2_x": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "perspective_c2_y": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "perspective_c3_x": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "perspective_c3_y": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "perspective_c4_x": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "perspective_c4_y": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": -1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "position": 0.4,
            "reader": {
                "acodec": "vorbis",
                "audio_bit_rate": 0,
                "audio_stream_index": 1,
                "audio_timebase": {
                    "den": 1000,
                    "num": 1
                },
                "channel_layout": 3,
                "channels": 2,
                "display_ratio": {
                    "den": 240,
                    "num": 427
                },
                "duration": 52.0,
                "file_size": "10051167",
                "fps": {
                    "den": 1,
                    "num": 24
                },
                "has_audio": true,
                "has_single_image": false,
                "has_video": true,
                "height": 480,
                "interlaced_frame": false,
                "path": "sintel_trailer-480p.webm",
                "pixel_format": 0,
                "pixel_ratio": {
                    "den": 1,
                    "num": 1
                },
                "sample_rate": 48000,
                "top_field_first": true,
                "type": "FFmpegReader",
                "vcodec": "vp8",
                "video_bit_rate": 0,
                "video_length": "1248",
                "video_stream_index": 0,
                "video_timebase": {
                    "den": 1000,
                    "num": 1
                },
                "width": 854
            },
            "rotation": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 0.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "scale": 1,
            "scale_x": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "scale_y": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "shear_x": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 0.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "shear_y": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 0.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "start": 0,
            "time": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 0.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "title": "sintel_trailer-480p.webm",
            "volume": {
                "Points": [
                    {
                        "co": {
                            "X": 1.0,
                            "Y": 1.0
                        },
                        "interpolation": 2
                    }
                ]
            },
            "wave_color": {
                "alpha": {
                    "Points": [
                        {
                            "co": {
                                "X": 1.0,
                                "Y": 255.0
                            },
                            "handle_left": {
                                "X": 1.0,
                                "Y": 255.0
                            },
                            "handle_right": {
                                "X": 1.0,
                                "Y": 255.0
                            },
                            "handle_type": 0,
                            "interpolation": 0
                        }
                    ]
                },
                "blue": {
                    "Points": [
                        {
                            "co": {
                                "X": 1.0,
                                "Y": 255.0
                            },
                            "handle_left": {
                                "X": 1.0,
                                "Y": 255.0
                            },
                            "handle_right": {
                                "X": 1.0,
                                "Y": 255.0
                            },
                            "handle_type": 0,
                            "interpolation": 0
                        }
                    ]
                },
                "green": {
                    "Points": [
                        {
                            "co": {
                                "X": 1.0,
                                "Y": 123.0
                            },
                            "handle_left": {
                                "X": 1.0,
                                "Y": 123.0
                            },
                            "handle_right": {
                                "X": 1.0,
                                "Y": 123.0
                            },
                            "handle_type": 0,
                            "interpolation": 0
                        }
                    ]
                },
                "red": {
                    "Points": [
                        {
                            "co": {
                                "X": 1.0,
                                "Y": 0.0
                            },
                            "handle_left": {
                                "X": 1.0,
                                "Y": 0.0
                            },
                            "handle_right": {
                                "X": 1.0,
                                "Y": 0.0
                            },
                            "handle_type": 0,
                            "interpolation": 0
                        }
                    ]
                }
            },
            "waveform": false
        }
    ],
    "duration": 300,
    "effects": [],
    "export_path": "",
    "files": [
        {
            "acodec": "vorbis",
            "audio_bit_rate": 0,
            "audio_stream_index": 1,
            "audio_timebase": {
                "den": 1000,
                "num": 1
            },
            "channel_layout": 3,
            "channels": 2,
            "display_ratio": {
                "den": 240,
                "num": 427
            },
            "duration": 52.0,
            "file_size": "10051167",
            "fps": {
                "den": 1,
                "num": 24
            },
            "has_audio": true,
            "has_single_image": false,
            "has_video": true,
            "height": 480,
            "id": "JV8ZDDZ8IT",
            "interlaced_frame": false,
            "media_type": "video",
            "path": "sintel_trailer-480p.webm",
            "pixel_format": 0,
            "pixel_ratio": {
                "den": 1,
                "num": 1
            },
            "sample_rate": 48000,
            "top_field_first": true,
            "type": "FFmpegReader",
            "vcodec": "vp8",
            "video_bit_rate": 0,
            "video_length": "1248",
            "video_stream_index": 0,
            "video_timebase": {
                "den": 1000,
                "num": 1
            },
            "width": 854
        }
    ],
    "fps": {
        "den": 1,
        "num": 24
    },
    "height": 720,
    "id": "T0",
    "layers": [
        {
            "id": "L0",
            "label": "",
            "lock": false,
            "number": 0,
            "y": 0
        },
        {
            "id": "L1",
            "label": "",
            "lock": false,
            "number": 1,
            "y": 0
        },
        {
            "id": "L2",
            "label": "",
            "lock": false,
            "number": 2,
            "y": 0
        },
        {
            "id": "L3",
            "label": "",
            "lock": false,
            "number": 3,
            "y": 0
        },
        {
            "id": "L4",
            "label": "",
            "lock": false,
            "number": 4,
            "y": 0
        }
    ],
    "markers": [],
    "playhead_position": 0,
    "profile": "HDV 720 24p",
    "progress": [],
    "sample_rate": 44100,
    "scale": 16,
    "settings": {},
    "tick_pixels": 100,
    "version": {
        "libopenshot": "0.1.2",
        "openshot-qt": "2.1.0"
    },
    "width": 1280
}


If you look at this, you'll see that it's kind of intuitive what some of the parameters are, but many of them I don't really know what they do. Also, you can see that there is a reference to a thumbnail for the clip which the OpenShot application generates. What I'd like to know is if/how I could use OpenShot API to create this file by (hopefully) just calling some high level functions like AddClipToProjectFile or InsertClipIntoProject, etc. Not sure if that's clear? From poking around the interwebs, I don't think this type of functionality is currently part of libopenshot? This would be super helpful for a project I am working on, but as I am very new to OpenShot I don't think I'm the right person to try to write that code if it doesn't currently exist.

I would appreciate any thoughts folks might have for me. Thanks and regards!
Piper984
New member
 
Posts: 3
Joined: Mon Nov 14, 2016 10:47 pm

Re: Programmatically create an OSP file

Postby marianomarini » Sat Dec 03, 2016 4:36 pm

This could be a nice feature if, and only if, you want to create a project with few clips starting from the the beginning.
I agree that: Start OpenShot, Create new Project, Import clips and put it on the track could be annoying. But writing on a shell terminal: create_project clip1=xxxx.xxx, clip2=yyyyy,xxx, ..... and so on could be even worst with many clips and in different time position.
User avatar
marianomarini
The voice of Experience
 
Posts: 205
Joined: Wed Jan 19, 2011 12:20 pm

Re: Programmatically create an OSP file

Postby Piper984 » Fri Dec 09, 2016 2:30 pm

So, I think we've confirmed that this functionality isn't currently in the API. Are there any professional service groups that offers Open Shot support/development services? Kinda of like Collabora or Fluendo for GStreamer support/customization?
Piper984
New member
 
Posts: 3
Joined: Mon Nov 14, 2016 10:47 pm

Re: Programmatically create an OSP file

Postby marianomarini » Fri Dec 09, 2016 7:37 pm

Piper984 wrote:So, I think we've confirmed that this functionality isn't currently in the API. Are there any professional service groups that offers Open Shot support/development services? Kinda of like Collabora or Fluendo for GStreamer support/customization?

Because the goal is to write an OSP file, it can be achieve through an external tool.
I can work on it, if the case, but only for OpenShot less than 2.x release.
User avatar
marianomarini
The voice of Experience
 
Posts: 205
Joined: Wed Jan 19, 2011 12:20 pm


Return to libopenshot

Who is online

Users browsing this forum: No registered users