---
name: "360_video_production"
description: "Shoot, stitch, and reframe 360-degree video. Use when someone asks about 360 cameras, stitching dual-fisheye footage, keyframing a 360 clip into a flat 16:9 or 9:16 cut, pulling a flat view out of equirectangular footage, or uploading 360 video to YouTube."
---

# 360 Video Production

## Purpose

Take 360-degree footage from capture to delivery. Cover the full run: shooting so the stitch holds, stitching multi-lens captures into equirectangular masters, reframing spherical footage into flat cuts with camera movement, and delivering either as immersive 360 or as standard flat video.

## Workflow

1. **Decide the delivery first.** Immersive 360 (viewer looks around on YouTube/VR) or flat reframe (standard 16:9 or 9:16 cut)? The choice drives every step. A flat reframe is a crop of the sphere, so resolution math matters: see Operating Rules.
2. **Shoot for the stitch.** Details in `references/shooting.md`. Short version: keep subjects off the stitch lines, keep the action at a safe distance from the camera, lock the horizon, and shoot one resolution tier above your flat target (a 1080p flat crop needs at least a 5.7K 360 source).
3. **Stitch.** Consumer cameras (Insta360, GoPro MAX) stitch in their free companion apps (Insta360 Studio, GoPro Player/Quik). Prosumer rigs stitch in Mistika VR or PTGui. Export the stitched master as equirectangular 2:1 MP4. Never reframe before stitching.
4. **Reframe for flat delivery.** Pick one route:
   - **Insta360 Studio / Quik app:** keyframe the virtual camera (pan, tilt, zoom), export flat at your aspect ratio. In Studio, keyframes only apply when exporting as flat "Video", never on 360 exports.
   - **NLE plugin:** GoPro FX Reframe (free, Premiere Pro / After Effects, works with any 360 footage) or GoPro's DaVinci Resolve Reframe plugin. Keyframe pan/tilt/rotate/zoom on the timeline.
   - **Scripted:** `bin/reframe.py` wraps ffmpeg's v360 filter for a single locked-off flat view (yaw, pitch, FOV, output size). Good for automation, batch pulls, and agents that need the math done for them.
   See `references/reframing.md` for recipes and the v360 parameter map.
5. **Deliver.** Flat exports go anywhere. For true 360 on YouTube, the file must be equirectangular 2:1 with spatial media metadata injected or YouTube plays it as a distorted flat video. See `references/delivery.md`.

## Output Contract

- Flat reframe: a standard MP4 at the requested aspect and resolution, with the camera moves the user asked for, verified by spot-checking frames (subject in frame, no stitch seam in view, horizon level).
- 360 master: equirectangular 2:1 MP4, H.264/AAC, spatial metadata present, spot-checked in a 360 player before upload.
- Every run reports: source resolution, FOV used, output resolution, and whether the resolution math holds (warn if the crop is upscaling).

## Operating Rules

1. **Resolution math is not optional.** A flat reframe is a crop. From an 8K equirectangular source (7680 wide), a 90-degree horizontal crop covers about 1920 source pixels, so a 1080p output is honest. From a 4K source (3840 wide), the same crop covers about 960 pixels, so 1080p output is an upscale. Warn the user; never silently upscale.
2. **Stitch before you touch anything.** Reframing, grading, and effects all happen on the stitched equirectangular master. Raw dual-fisheye files (.insv, .360) are not editable footage.
3. **Hide the seams.** Stitch lines run along the sides of most dual-lens cameras. Frame key moments away from them, and check the seam zones before export. Optical flow stitching can ghost moving subjects that cross seams.
4. **Horizon first.** A tilted horizon in 360 makes viewers seasick. Level the horizon in the stitch/reframe step before any creative keyframing.
5. **No fabricated specs.** Camera capabilities change fast. When a camera model matters (max resolution, frame rate, stitch software), verify the current spec from the manufacturer's page instead of quoting memory.
6. **YouTube 360 needs the metadata.** Equirectangular 2:1 alone is not enough; inject spatial media metadata (Google's Spatial Media Metadata Injector, or a camera/exporter that writes it) or the upload plays flat.
