Record display, webcam and pulseaudio using ffmpeg
#!/bin/sh | |
# 1. create v4l2loopback device /dev/video42 using | |
# $ sudo modprobe v4l2loopback video_nr=42 max_buffers=2 exclusive_caps=1 | |
ts=$(date +%Y-%m-%dT%H:%M:%SZ-%s) | |
PREFIX=/mnt/data/Videos | |
CAMERA_INPUT=/dev/video0 | |
CAMERA_LOOPBACK=/dev/video42 | |
CAMERA_OUTPUT="${PREFIX}/cap-${ts}/${ts}-camera.mp4" | |
DISPLAY_OUTPUT="${PREFIX}/cap-${ts}/${ts}-display.mp4" | |
DISPLAY_OFFSET=2560 | |
DISPLAY_SIZE=2560x1440 | |
[ -z "$DISPLAY" ] && { | |
echo 'ERROR: Environment variable DISPLAY is not set' 1>&2 | |
exit 1 | |
} | |
mkdir -p "${PREFIX}/cap-${ts}" | |
exec ffmpeg \ | |
-hide_banner \ | |
-y \ | |
-hwaccel cuda \ | |
-vsync cfr \ | |
-f v4l2 \ | |
-thread_queue_size 512 \ | |
-video_size 1920x1080 \ | |
-input_format mjpeg \ | |
-framerate 30 \ | |
-i $CAMERA_INPUT \ | |
-f x11grab \ | |
-thread_queue_size 512 \ | |
-video_size $DISPLAY_SIZE \ | |
-i $DISPLAY+$DISPLAY_OFFSET \ | |
-f pulse \ | |
-thread_queue_size 512 \ | |
-i default \ | |
-map 0 \ | |
-map 2 \ | |
-c:v hevc_nvenc \ | |
-c:a libfdk_aac \ | |
-movflags +faststart \ | |
$CAMERA_OUTPUT \ | |
-map 1 \ | |
-map 2 \ | |
-c:v hevc_nvenc \ | |
$DISPLAY_OUTPUT \ | |
-map 0 \ | |
-c:v rawvideo \ | |
-f v4l2 \ | |
-pix_fmt yuv420p \ | |
$CAMERA_LOOPBACK |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment