Skip to content

Instantly share code, notes, and snippets.

@sposmen
Created March 24, 2026 19:20
Show Gist options
  • Select an option

  • Save sposmen/0cabfe4970b71d05e8270b39fb8ae320 to your computer and use it in GitHub Desktop.

Select an option

Save sposmen/0cabfe4970b71d05e8270b39fb8ae320 to your computer and use it in GitHub Desktop.
ffmpeg simple screen Recorder for Mac
#!/bin/bash
PIDFILE="$HOME/.ffmpeg_screen_record.pid"
OUTDIR="$HOME/Movies"
get_default_video() {
ffmpeg -f avfoundation -list_devices true -i "" 2>&1 \
| grep "Capture screen" \
| head -n 1 \
| sed -E 's/.*\[(.*)\].*/\1/'
}
DEFAULT_VIDEO=$(get_default_video)
DEFAULT_VIDEO=${DEFAULT_VIDEO:-0}
DEFAULT_AUDIO="none"
DEFAULT_DURATION=3600 # 1 hora
choose_devices_and_options() {
echo "🔍 Detectando dispositivos..."
ffmpeg -f avfoundation -list_devices true -i "" 2>&1 | grep '\['
echo ""
echo "⏳ Defaults en 10s:"
echo " video=$DEFAULT_VIDEO audio=$DEFAULT_AUDIO duración=${DEFAULT_DURATION}s (~1h)"
read -t 10 -p "🎥 Video ID [$DEFAULT_VIDEO]: " VIDEO_ID
read -t 10 -p "🎤 Audio ID [$DEFAULT_AUDIO]: " AUDIO_ID
read -t 10 -p "⏱️ Duración en segundos [$DEFAULT_DURATION]: " DURATION
VIDEO_ID=${VIDEO_ID:-$DEFAULT_VIDEO}
AUDIO_ID=${AUDIO_ID:-$DEFAULT_AUDIO}
DURATION=${DURATION:-$DEFAULT_DURATION}
if [ "$AUDIO_ID" = "none" ]; then
INPUT="$VIDEO_ID:none"
AUDIO_FLAG="-an"
else
INPUT="$VIDEO_ID:$AUDIO_ID"
AUDIO_FLAG="-c:a aac -b:a 96k"
fi
}
start_recording() {
if [ -f "$PIDFILE" ]; then
echo "⚠️ Ya hay una grabación en curso (PID $(cat $PIDFILE))"
exit 1
fi
choose_devices_and_options
FILENAME="$OUTDIR/rec_$(date +%Y-%m-%d_%H-%M-%S).mp4"
echo "🎬 Grabando en 1440p → $FILENAME"
echo "📡 Input: $INPUT"
echo "⏱️ Duración: $DURATION segundos"
ffmpeg -f avfoundation \
-framerate 30 \
-use_wallclock_as_timestamps 1 \
-t "$DURATION" \
-i "$INPUT" \
-vf "scale=2560:1440:flags=lanczos" \
-c:v h264_videotoolbox -b:v 5M \
$AUDIO_FLAG \
-movflags +faststart \
"$FILENAME" \
> /dev/null 2>&1 &
PID=$!
echo $PID > "$PIDFILE"
echo "✅ Grabando (PID $PID)"
}
stop_recording() {
if [ ! -f "$PIDFILE" ]; then
echo "⚠️ No hay grabación activa"
exit 1
fi
PID=$(cat "$PIDFILE")
echo "🛑 Deteniendo grabación (PID $PID)..."
kill -2 "$PID"
wait "$PID" 2>/dev/null
rm -f "$PIDFILE"
echo "✅ Grabación finalizada correctamente"
}
status_recording() {
if [ -f "$PIDFILE" ]; then
PID=$(cat "$PIDFILE")
if ps -p $PID > /dev/null 2>&1; then
echo "🎥 Grabando (PID $PID)"
else
echo "⚠️ PID existe pero proceso no activo"
fi
else
echo "⏹️ No hay grabación activa"
fi
}
case "$1" in
start) start_recording ;;
stop) stop_recording ;;
status) status_recording ;;
*)
echo "Uso: $0 {start|stop|status}"
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment