1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
# cs2pov
Counter-Strike 2 POV recording automation. Largely AI-assisted and personalized to my system, maybe I'll make this more ubiquitous in the future.
## Installation
### Requirements
- **Python 3.10+**
- **CS2** installed via Steam
- **FFmpeg** for video/audio capture
- **xdotool** for window automation
- **PulseAudio** for audio capture (pactl)
- **GPU** with Vulkan support (NVIDIA or AMD)
```bash
Install Python dependencies:
`pip install -e .`
## Gentoo (based)
emerge -av media-video/ffmpeg x11-misc/xdotool media-sound/pulseaudio
## Ubuntu/Debian
apt install ffmpeg xdotool pulseaudio-utils
```
## Quick Start
```bash
# List players in a demo
cs2pov list /path/to/demo.dem
# Record a player's POV
cs2pov -d /path/to/demo.dem -p "PlayerName" -o recording.mp4
```
## Usage
```
cs2pov [-h] --demo DEMO --player PLAYER --output OUTPUT [options]
```
### Required Arguments
| Argument | Short | Description |
|----------|-------|-------------|
| `--demo` | `-d` | Path to demo file (.dem) |
| `--player` | `-p` | Player to record (name or SteamID) |
| `--output` | `-o` | Output video file path |
### Optional Arguments
| Argument | Short | Default | Description |
|----------|-------|---------|-------------|
| `--resolution` | `-r` | 1920x1080 | Recording resolution |
| `--framerate` | `-f` | 60 | Recording framerate |
| `--no-hud` | | off | Hide HUD elements (except killfeed) |
| `--no-audio` | | off | Disable audio recording |
| `--audio-device` | | auto | PulseAudio device for audio capture |
| `--no-trim` | | off | Skip post-processing, keep full recording |
| `--display` | | 0 | X display number (0 = real display) |
| `--cs2-path` | | auto | Path to CS2 installation |
| `--verbose` | `-v` | off | Verbose output |
| `--version` | | | Show version |
## How It Works
1. **Parse demo** - Extract player list and metadata using demoparser2
2. **Generate config** - Create CS2 CFG file with spectator settings
3. **Copy demo** - Place demo in CS2's replays directory
4. **Launch CS2** - Start CS2 via Steam with the generated config
5. **Wait for map load** - Monitor console.log for map load completion
6. **Hide demo UI** - Send Shift+F2 to hide playback controls
7. **Start capture** - Launch FFmpeg to record display + audio (PulseAudio)
8. **Recording loop** - Send F5 periodically to keep spectator locked on target player
9. **Wait for demo end** - Monitor console.log for demo completion
10. **Finalize** - Stop capture and terminate CS2
11. **Post-process** - Trim start (until POV selected) and death periods from video
### Player Identification
The `--player` argument accepts multiple formats:
- **Player name**: `"PlayerName"` (case-insensitive, partial match supported)
- **SteamID64**: `76561198012345678`
- **SteamID**: `STEAM_0:1:12345678`
- **SteamID3**: `[U:1:12345678]`
### Subcommands
#### `list` - List players in a demo
```bash
cs2pov list /path/to/demo.dem
```
Shows all players with their names, teams, and SteamIDs.
## Examples
```bash
# Basic recording
cs2pov -d match.dem -p "s1mple" -o s1mple_pov.mp4
# Record by SteamID
cs2pov -d match.dem -p 76561198012345678 -o recording.mp4
# Higher resolution, lower framerate
cs2pov -d match.dem -p "Player" -o out.mp4 -r 2560x1440 -f 30
# Hide HUD, verbose output
cs2pov -d match.dem -p "Player" -o out.mp4 --no-hud -v
# Custom CS2 installation path
cs2pov -d match.dem -p "Player" -o out.mp4 --cs2-path /mnt/games/SteamLibrary/steamapps/common/Counter-Strike\ Global\ Offensive
# Use virtual display (experimental, may not work with Vulkan)
cs2pov -d match.dem -p "Player" -o out.mp4 --display 99
```
## Environment Variables
| Variable | Description |
|----------|-------------|
| `CS2_PATH` | Path to CS2 installation (alternative to `--cs2-path`) |
```bash
export CS2_PATH="/mnt/games/SteamLibrary/steamapps/common/Counter-Strike Global Offensive"
cs2pov -d match.dem -p "Player" -o out.mp4
```
## Noteworthy Issues/Workarounds
### Recording Uses Your Real Display
Due to some framebuffer stuff that's above my head, the tool defaults to `--display 0` (your real display) which means CS will take up your main display while recording. I mostly batch these at night so it's not a huge deal to me, but I'm hoping to experiment with headless recording in the future.
### Close CS2 Before Recording
You can't run multiple instances of CS through one account, so make sure it's closed ahead of time.
### Audio Capture
I'm sorry for making you use Pulseaudio. The audio is captured from your default PulseAudio output so this captures all system audio, not just CS2.
|