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

sudo pacman -S socat

Debian/Ubuntu

sudo apt install socat

Asegurate de tener también mpv instalado:

# Arch
sudo pacman -S mpv

1. Abrir un video con socket habilitado

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)

echo '{"command": ["keypress", "m"]}' | socat - /tmp/mpv.sock

Play/Pause (tecla espacio)

echo '{"command": ["keypress", "space"]}' | socat - /tmp/mpv.sock

Obtener volumen actual

echo '{"command": ["get_property", "volume"]}' | socat - /tmp/mpv.sock

Establecer volumen (0-100)

echo '{"command": ["set_property", "volume", 50]}' | socat - /tmp/mpv.sock

Obtener posición actual (tiempo)

echo '{"command": ["get_property", "time-pos"]}' | socat - /tmp/mpv.sock

Seek (ir a un tiempo específico en segundos)

echo '{"command": ["seek", 60]}' | socat - /tmp/mpv.sock  # ir a 1:00

Obtener duración total

echo '{"command": ["get_property", "duration"]}' | socat - /tmp/mpv.sock

Salir de mpv

echo '{"command": ["quit"]}' | socat - /tmp/mpv.sock

3. Estructura de los comandos JSON

Los comandos siguen este formato:

{"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

#!/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í:

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