This repository has no description
2.2 kB
87 lines
1#!/usr/bin/env bash
2SHADER_TEMPLATE="@shaderPath@"
3ASCII_MODE=false
4ASCII_SCALE=6
5
6while [[ $# -gt 0 ]]; do
7 case $1 in
8 --ascii)
9 ASCII_MODE=true
10 shift
11 # Check if next arg is a number (the scale)
12 if [[ $# -gt 0 && $1 =~ ^[0-9]+$ ]]; then
13 ASCII_SCALE=$1
14 shift
15 fi
16 ;;
17 *)
18 echo "Unknown option: $1" >&2
19 echo "Usage: android-webcam [--ascii [SIZE]]" >&2
20 echo " SIZE: character size 1-20 (default: 6)" >&2
21 exit 1
22 ;;
23 esac
24done
25
26if $ASCII_MODE; then
27 # ASCII mode needs both devices
28 if [[ ! -e /dev/video0 ]] || [[ ! -e /dev/video1 ]]; then
29 echo "Error: /dev/video0 and /dev/video1 must exist for ASCII mode" >&2
30 echo "v4l2loopback should be configured with devices=2" >&2
31 exit 1
32 fi
33 # Generate shader with scale value
34 SHADER_PATH=$(mktemp --suffix=.hook)
35 sed "s/@SCALE@/${ASCII_SCALE}/" "${SHADER_TEMPLATE}" > "${SHADER_PATH}"
36else
37 if [[ ! -e /dev/video0 ]]; then
38 echo "Error: /dev/video0 must exist" >&2
39 exit 1
40 fi
41fi
42
43cleanup() {
44 echo "Stopping..."
45 kill "${SCRCPY_PID}" 2>/dev/null || true
46 [[ -n "${FFMPEG_PID:-}" ]] && kill "${FFMPEG_PID}" 2>/dev/null || true
47 [[ -n "${SHADER_PATH:-}" && -f "${SHADER_PATH}" ]] && rm -f "${SHADER_PATH}"
48}
49trap cleanup EXIT
50
51# Start scrcpy to stream phone camera to /dev/video0
52echo "Starting phone camera stream..."
53scrcpy \
54 --video-source=camera \
55 --camera-facing=back \
56 --no-audio \
57 --v4l2-sink=/dev/video0 \
58 --video-encoder=c2.exynos.h264.encoder \
59 --camera-size=1920x1080 &
60SCRCPY_PID=$!
61
62if $ASCII_MODE; then
63 sleep 2
64
65 # Start ffmpeg with ASCII shader to /dev/video1
66 echo "Starting ASCII filter pipeline (scale=${ASCII_SCALE})..."
67 ffmpeg \
68 -f v4l2 -i /dev/video0 \
69 -vf "libplacebo=custom_shader_path=${SHADER_PATH}" \
70 -f v4l2 -pix_fmt yuv420p /dev/video1 &
71 FFMPEG_PID=$!
72
73 echo ""
74 echo "Android ASCII webcam running!"
75 echo " Raw camera: /dev/video0 (Phone Camera)"
76 echo " ASCII output: /dev/video1 (ASCII Webcam)"
77 echo " Character size: ${ASCII_SCALE}"
78else
79 echo ""
80 echo "Android webcam running!"
81 echo " Camera: /dev/video0 (Phone Camera)"
82fi
83
84echo ""
85echo "Press Ctrl+C to stop"
86
87wait