Skip to content

Picture-in-Picture (PiP) Recipe

Learn how to overlay a secondary camera feed (e.g. facecam) onto a primary video stream.

go
package main

import (
	"context"
	"time"

	"github.com/farshidrezaei/vidonex/composer"
	"github.com/farshidrezaei/vidonex/timeline"
	"github.com/farshidrezaei/vidonex/types"
)

func main() {
	tl := timeline.New(
		timeline.WithCanvas(types.Res1080p),
		timeline.WithFPS(types.FPS60),
	)

	// Main Gameplay Track (Layer 0)
	mainTrack := timeline.NewTrack("gameplay", timeline.TrackKindVideo).SetZIndex(0)
	mainTrack.AddClip(
		timeline.NewClip("gameplay_clip", "assets/gameplay.mp4", 0, 15*time.Second),
	)

	// Facecam Overlay Track (Layer 1)
	pipTrack := timeline.NewTrack("facecam", timeline.TrackKindOverlay).SetZIndex(1)
	pipTrack.AddClip(
		timeline.NewClip("facecam_clip", "assets/facecam.mp4", 2*time.Second, 10*time.Second).
			WithScale(0.25).
			WithPosition(types.Point{X: 1400, Y: 40}).
			WithOpacity(0.95),
	)

	tl.AddTrack(mainTrack, pipTrack)

	c := composer.New()
	_, _ = c.Render(context.Background(), tl, "pip_output.mp4", nil)
}

Released under the MIT License.