← back to AgentAbrams

video/compose_video.sh

55 lines

#!/usr/bin/env bash
set -euo pipefail

# compose_video.sh — Combine avatar + screen recording + voice into final video.
#
# Usage:
#   bash video/compose_video.sh <screen.mp4> <avatar.mp4> <voice.mp3> <output.mp4>
#
# If avatar is not available, creates a static image video from audio only.

SCREEN="${1:-screen.mp4}"
AVATAR="${2:-assets/avatar.mp4}"
VOICE="${3:-media/output/voice.mp3}"
OUTPUT="${4:-media/output/video.mp4}"

mkdir -p "$(dirname "$OUTPUT")"

if [ -f "$AVATAR" ] && [ -f "$SCREEN" ]; then
    echo "Composing: avatar + screen + voice"
    ffmpeg -y \
        -i "$SCREEN" \
        -i "$AVATAR" \
        -i "$VOICE" \
        -filter_complex "
            [0:v]scale=1344:1080[screen];
            [1:v]scale=576:1080[avatar];
            [avatar][screen]hstack=inputs=2[vout]
        " \
        -map "[vout]" \
        -map 2:a \
        -c:v libx264 -preset fast -crf 23 \
        -c:a aac -b:a 192k \
        -shortest \
        "$OUTPUT"
elif [ -f "$VOICE" ]; then
    echo "No screen/avatar found. Creating static video from cover + audio."
    COVER="assets/cover.png"
    if [ ! -f "$COVER" ]; then
        # Generate a simple placeholder cover
        ffmpeg -y -f lavfi -i "color=c=black:s=1920x1080:d=1" -frames:v 1 "$COVER"
    fi
    ffmpeg -y \
        -loop 1 -i "$COVER" \
        -i "$VOICE" \
        -c:v libx264 -tune stillimage -preset fast -crf 23 \
        -c:a aac -b:a 192k \
        -shortest \
        "$OUTPUT"
else
    echo "ERROR: No voice audio found at $VOICE"
    exit 1
fi

echo "Video created: $OUTPUT"