---
title: "Socat MPV"
date: 2026-03-08T02:50:58-03:00
tags: ['cli']
---

# Tutorial: Controlar MPV con SOCAT

## ¿Qué es esto?

MPV tiene un servidor IPC (inter-process communication) que permite enviar comandos mientras el video está reproduciendo. Usamos `socat` para comunicarse con el socket.

## Instalación

### Arch Linux
```bash
sudo pacman -S socat
```

### Debian/Ubuntu
```bash
sudo apt install socat
```

Asegurate de tener también mpv instalado:
```bash
# Arch
sudo pacman -S mpv
```

## 1. Abrir un video con socket habilitado

```bash
mpv video.mp4 --input-ipc-server=/tmp/mpv.sock
```

Esto crea un socket en `/tmp/mpv.sock` para recibir comandos.

## 2. Enviar comandos con socat

### Silenciar/Desmutear (tecla m)
```bash
echo '{"command": ["keypress", "m"]}' | socat - /tmp/mpv.sock
```

### Play/Pause (tecla espacio)
```bash
echo '{"command": ["keypress", "space"]}' | socat - /tmp/mpv.sock
```

### Obtener volumen actual
```bash
echo '{"command": ["get_property", "volume"]}' | socat - /tmp/mpv.sock
```

### Establecer volumen (0-100)
```bash
echo '{"command": ["set_property", "volume", 50]}' | socat - /tmp/mpv.sock
```

### Obtener posición actual (tiempo)
```bash
echo '{"command": ["get_property", "time-pos"]}' | socat - /tmp/mpv.sock
```

### Seek (ir a un tiempo específico en segundos)
```bash
echo '{"command": ["seek", 60]}' | socat - /tmp/mpv.sock  # ir a 1:00
```

### Obtener duración total
```bash
echo '{"command": ["get_property", "duration"]}' | socat - /tmp/mpv.sock
```

### Salir de mpv
```bash
echo '{"command": ["quit"]}' | socat - /tmp/mpv.sock
```

## 3. Estructura de los comandos JSON

Los comandos siguen este formato:

```json
{"command": ["nombre_del_comando", argumento1, argumento2, ...]}
```

### Comandos con argumentos:

| Comando | Descripción | Ejemplo |
|---------|-------------|---------|
| `keypress` | Envía una tecla | `["keypress", "m"]` |
| `set_property` | Cambia una propiedad | `["set_property", "volume", 80]` |
| `get_property` | Obtiene una propiedad | `["get_property", "time-pos"]` |
| `seek` | Ir a posición (segundos) | `["seek", 120]` |

## 4. Script de ejemplo

```bash
#!/bin/bash

SOCKET="/tmp/mpv.sock"

case "$1" in
    mute)
        echo '{"command": ["keypress", "m"]}' | socat - $SOCKET
        ;;
    pause)
        echo '{"command": ["keypress", "space"]}' | socat - $SOCKET
        ;;
    vol)
        echo "{\"command\": [\"set_property\", \"volume\", $2]}" | socat - $SOCKET
        ;;
    pos)
        echo '{"command": ["get_property", "time-pos"]}' | socat - $SOCKET
        ;;
    quit)
        echo '{"command": ["quit"]}' | socat - $SOCKET
        ;;
    *)
        echo "Uso: $0 {mute|pause|vol <0-100>|pos|quit}"
        ;;
esac
```

Guardalo como `mpvctl` y usalo así:

```bash
chmod +x mpvctl
./mpvctl mute        # silenciar
./mpvctl pause       # play/pause
./mpvctl vol 50      # volumen al 50%
./mpvctl pos         # ver posición actual
./mpvctl quit        # cerrar mpv
```

## 5. Keys comunes de mpv

| Tecla | Acción |
|-------|--------|
| `space` | Play/Pause |
| `m` | Mute |
| `f` | Fullscreen |
| `left`/`right` | Retroceder/Avanzar 5s |
| `up`/`down` | Volumen +/- |
| `q` | Quit |

## Notas

- El socket debe estar habilitado con `--input-ipc-server`
- Si el socket no existe, el comando falla
- Algunos comandos devuelven JSON con el resultado
