← 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"