Skip to content

Multicam Takes and Jobs

⚠️ Warning: The multicam API is still in beta. Bugs are likely to occur. Please report any issues to support@move.ai

Before you begin, make sure you have read the quickstart guide. This provides useful hints and tips on what equipment you need as well as general advice to get the most out of the multicam API

A multicam take is a take that defines a recording session with multiple cameras. The process for creating mocap outputs for a multicam take has a few more steps than for singlecam - but the output is generally of much higher quality.

The steps are:

  1. Create the calibration files
  2. Create a calibration volume
  3. Create the multicam files
  4. Create the multicam take
  5. Create the multicam job

1. Create calibration files

First, you need to calibrate your volume. Once you have setup your cameras and recorded your calibration videos you can upload them as normal using the files api. See here for how to upload the files.

See our articles here for how best to setup your cameras and here for how to record a calibration.

2. Create calibration volume

Once you have created your calibration files you can now create the volume.

See the api docs here for more information on the attributes on createVolumeWithHuman mutation. Only certain camera lenses are supported at the moment. See here for a complete list

mutation createVolumeMutation{
    createVolumeWithHuman(
        areaType:NORMAL,
        humanHeight:1.77, // (1)
        syncMethod:{
            clapWindow:{
                startTime:2.0,
                endTime:4.0
            }

        },
        sources : [{
            deviceLabel:"cam01",  // (4)
            cameraSettings:{
                lens:"goprohero10-fhd"
            },
            clipWindow:{
                startTime:0.1,
                endTime:1.4
        },

            fileId:"file-2be2463e-ffa3-419b-beb4-ea0f99c79592", // (2)
            format:MP4
        },{
            deviceLabel:"cam02",
            cameraSettings:{
                lens:"goprohero10-fhd"
            },
            clipWindow:{
                startTime:0.1,
                endTime:1.4
            },


            fileId:"file-edcf5b93-24b4-45b8-91b2-0985c4c44665", // (3)
            format:MP4
        },],


    ){
        areaType,
        client{
                id
                name
            },
        created,
        humanHeight,
        id,
        metadata,
        sources{
            cameraSettings{
                lens
            },
            deviceLabel,
            file{
                presignedUrl
            },
            format
        },
        state
    }
}
  1. The height of the human in metres
  2. This is the file from cam01 that was created in step 1
  3. This is the file from cam02 that was created in step 1
  4. A human readable label identifying this camera

3. Create multicam files

You can now shoot your take using the same camera configuration as you used for the calibration. Upload the files in the same way as you do for calibration

4. Create take

Before creating the take ensure that the volume has finished processing. Use the volume id provided from the creation of the volume in step 2

{
    getVolume(id: "volume-6c5c421e-795f-4381-af81-a09e707af8cf"){
        ... on Volume {
                ...VolumeFields
            }
    }
}
fragment VolumeFields on HumanVolume {
    id
    state
}

Once the volume has finished processing and the files for the take are uploaded you can then create a take object.

mutation createMultiCamTake {
    take: createMultiCamTake(

        volumeId:"volume-6c5c421e-795f-4381-af81-a09e707af8cf", // (1)
        syncMethod:{
            clapWindow:{
                startTime:2.0,
                endTime:4.0
            }

        },

        sources : [{
            deviceLabel:"cam01", // (4)
            cameraSettings:{
                lens:"goprohero10-fhd"
            },

            fileId:"file-571d12ae-2715-4e02-948f-81d5859ef0e9", // (2)

            format:MP4
        },{
            deviceLabel:"cam02",
            cameraSettings:{
                lens:"goprohero10-fhd"
            },

            fileId:"3dd40b58-d219-4400-9dd4-d43e4a981dce", // (3)
            format:MP4
        },],


    ) {

        id
        metadata
        created
        client{
            id
            name
        }
        sources
        {
            cameraSettings
            {
                lens
            }
        ,
            deviceLabel,
                file
            {
                presignedUrl
                id
            }
        ,
            format
        }
    }
}
  1. This is the id of the volume returned in step 2
  2. This is the file ID of the file created in step 3
  3. This is the file ID of the file created in step 3
  4. The same human readable name as used in step 2. It is crucial that these match the names used in the volume creation

5. Create job

You can now create the job which will generate the mocap output for the take using the ID generated in step 4. See the api docs here for more information on the attributes on createMultiCamJob mutation.

Processing with default outputs

Unless specified, Multicam runs will generate the following default output files: render_video, main_fbx, main_usdc, main_usdz, main_blend and motion_data

mutation Jobs {
    createMultiCamJob(
        takeId: "take-45fed3ed-e2c8-4c46-8ddc-8308df0ff3fa",
        numberOfActors:1
    ) {
        id
        state
        created
        metadata
        client{
            id
        }
        take{
            client{
                id
            }
            created
            id
            metadata
        }

    }
}

Processing with specific outputs

You can also specify the outputs you want to generate by passing the outputs parameter. You can find the list of available outputs here.

mutation Jobs {
    createMultiCamJob(
        takeId: "take-45fed3ed-e2c8-4c46-8ddc-8308df0ff3fa",
        numberOfActors:1,
        outputs: [RENDER_VIDEO, MAIN_FBX, MAIN_USDC, MAIN_GLB]
    ) {
        id
        state
        created
        metadata
        client{
            id
        }
        outputs {
            format
            file {
              presignedUrl
            }
        }
    }
}