Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿FFprobe eligió la portada? Verifica el flujo de video antes de mapearlo

Excluye las imágenes adjuntas, cuenta los candidatos y usa el índice real del flujo para comprobar una vista previa del mismo archivo.

Diagrama que distingue cero, uno y varios candidatos de video sin portada
Ilustración explicativa original: cuenta los flujos candidatos antes de elegir. Watch at Ease

Un archivo puede contener un flujo de video que solo sea su portada. Si un script interpreta la primera fila de video como la película principal, puede leer las dimensiones de la imagen o crear una miniatura equivocada. Empieza por el inventario: cambiar el códec de salida no demuestra que elegiste la entrada correcta.

Este procedimiento se aplica a un archivo local completo que no cambia y a una vista previa de un solo flujo. Distingue entre cero, uno y varios candidatos. No elimina portadas de tu biblioteca, no elige automáticamente un ángulo de cámara ni repara el mapeo de una transmisión en directo.

1. Conserva el inventario completo antes de filtrar

Anota la ruta, el tamaño, la fecha de modificación y las compilaciones de FFmpeg y ffprobe. Trabaja con una copia que no cambie, sobre todo si otro programa aún descarga o reescribe el archivo. Ejecuta ffprobe -v error -show_streams -show_format -of json "INPUT" y guarda la salida estándar, los errores y el código de salida. Sustituye INPUT por la ruta real. Un fallo de inspección es otro problema: un JSON incompleto o vacío no confirma un inventario correcto.

Revisa index, codec_type, codec_name, dimensiones, etiquetas y disposition de cada flujo. No descartes todos los MJPEG porque la portada de un caso use ese códec. Tampoco identifican por sí solos el video principal la ausencia del número de fotogramas ni una tasa que parezca cero. Una pregunta independiente de Stack Overflow muestra el riesgo: una imagen MJPEG adjunta aparecía antes del video H.264.

2. Cuenta los candidatos antes de elegir

Ejecuta ffprobe -v error -select_streams V -show_entries stream=index,codec_name,width,height:stream_disposition=default,attached_pic:stream_tags=title,language -of json "INPUT". La V mayúscula es intencional. Lee el arreglo streams solo si el comando termina correctamente; los metadatos opcionales ausentes siguen siendo desconocidos. Esto excluye las imágenes reconocidas como tales, pero no detecta cualquier imagen fija mal etiquetada.

Cero candidatos: conserva el inventario y detén la generación de la vista previa de video. Es un resultado legítimo para un archivo de audio con portada. Uno: conserva su index real y verifica la imagen. Varios: compara etiquetas, dimensiones y vistas previas y elige la pista deseada. La marca default o una resolución mayor son pistas, pero no definen tu intención editorial. No añadas :0 solo para ocultar la ambigüedad.

3. Transfiere el índice, no la posición del arreglo

Supón que el JSON filtrado contiene una sola fila con index: 1. Ocupa streams[0], pero sigue representando el flujo de entrada 1. Si el mismo archivo es la primera entrada de FFmpeg, el mapeo explícito es 0:1. El cero identifica el archivo de entrada y el uno su flujo. En un script, conserva index junto con el archivo elegido y las razones de la selección.

Vuelve a inspeccionar si cambia el archivo, el orden de las entradas o las opciones de demultiplexado. No extiendas este procedimiento a URL en directo, listas cambiantes o grabaciones que siguen creciendo: otra apertura puede observar un inventario distinto. Un informe de TV en directo de Jellyfin describe una discrepancia así. Es un caso reportado, no una garantía de comportamiento para todos los contenedores locales o fuentes en directo.

4. Crea una vista previa separada y distingue los errores

Para el índice 1 del ejemplo, crea una imagen nueva con ffmpeg -hide_banner -loglevel error -nostdin -n -i "INPUT" -map 0:1 -frames:v 1 "preview-check.jpg". Sustituye el índice por el verificado y usa un nombre de salida que no exista. El comando produce intencionalmente una imagen sin audio ni otras pistas. Ábrela y compara contenido reconocible con el video deseado; si empieza en negro, quizá necesites otra muestra posterior comprobada por separado.

Si la imagen elegida es correcta pero persiste un error de códec o filtro de flujo de bits, revisa todo el comando antes de borrar la portada. Un fallo histórico de miniaturas de Immich aplicaba un filtro de metadatos HEVC demasiado ampliamente, incluida una imagen MJPEG adjunta. La corrección aprobada limitó el filtro al flujo elegido y se integró el 1 de mayo de 2026. Ilustra un problema distinto de alcance de opciones; no demuestra que todas las instalaciones actuales de Immich tengan ese fallo.

5. Verifica la selección y delimita la evidencia

Nuestras pruebas sintéticas usaron Ubuntu FFmpeg 6.1.1-3ubuntu5. Un MP3 con portada devolvió un flujo v y ninguno V. Un MP4 con audio primero devolvió un candidato V con índice absoluto 1, aunque ocupaba la posición 0 del arreglo. Otro MP4 con dos videos devolvió dos candidatos y la política se detuvo para exigir una elección humana. La vista previa del candidato único se abrió, su decodificación completa terminó con código cero y los hashes de los tres archivos de entrada no cambiaron.

No reprodujimos el archivo DJI del informe de Immich ni probamos entradas en directo o todas las compilaciones de FFmpeg. Para tu archivo, conserva inventario, índice elegido, comando exacto y resultado. Puedes añadir ffmpeg -hide_banner -loglevel error -nostdin -i "INPUT" -map 0:1 -f null - con el índice correcto para comprobar la decodificación: lee el flujo seleccionado y puede requerir el tiempo de procesamiento del video completo. Revisa los errores además del código de salida. Una imagen correcta o una decodificación limpia no prueban que elegiste el ángulo preferido ni que una exportación posterior conserve todas las pistas.

Ejemplo de la posición cero del arreglo que corresponde al índice de entrada uno
Ilustración explicativa original: la posición del arreglo JSON y el índice de entrada son coordenadas distintas. Watch at Ease