viernes, 24 de noviembre de 2017

Script con una lista de comandos del codificador y conversor de vídeo Mencoder para GNU/LInux

MEncoder es un codificador de vídeo libre liberado bajo licencia GPL que se incluye en el reproductor multimedia MPlayer.  MEncoder ha sido construido usando las fuentes de MPlayer, este codificador permite convertir entre todos los formatos que este reproductor es capaz de soportar. También permite copiar sin modificaciones tanto la cadena de vídeo como la de sonido. Además soporta casi todos los filtros de MPlayer, y este último puede ser usado para visualizar su salida. He decidido actualizar este artículo porque comprobé que varios comandos de MEncoder ya no funcionaban correctamente.

Les dejo este script escrito en lenguaje BASH con una lista de comandos de MEncoder ,lo pueden descargar haciendo click en este link link o  pueden copiar y pegar el código que van a leer a continuación  en un documento de texto.

Código:
#!bin/bash
# Nombre: mencoder.sh
# Autor: viriato
# Origen: comunidad exdebian.org
# Lenguaje: BASH
# Licencia: GPL
# Propósito: edición y conversión de videos con Mencoder
# Dependencias:
# Código:
clear
function menu
{
echo 'SCRIPT QUE UTILIZA MENCODER'
echo
        echo '____________________MENU__________________________'
echo
echo 'Lista de opciones:'
echo
echo '1)  Convertir un video a otro video en cuaquier formato'
echo '2)  Convertir un video a otro video en cuaquier formato con un escalado diferente'
echo '3)  Concatenar varios videos en un único vídeo'
echo '4)  Cortar un fragmento de un video marcando el tiempo inicial y final o su peso en MB'
echo '5)  Incrustar subtitulos a un video'
echo '6)  Codificación de video en cualquier formato en otro video con un bitrate de superior'
echo '7)  Arreglar videos en formato AVI con índice roto o interpolado debido a errores de flujo en video o/y audio'
echo '8)  Rotar un vídeo en cualquier formato'
echo '9)  Añadir vídeo una pista de audio en formato MP3 a un video'
echo '10) Codificación de un video en 2 pasadas y con reducción del ruido de fondo'
echo '11) Crear un video con imágenes estáticas'
echo '12) Sincronización del video con el audio ligeramente desfasado'
echo '13) Convertir un video en formato MP4 a formato AVI'
echo '14) Convertir un video en formato MP4 a formato MPEG'
echo '15) Convertir un video en formato WMV a formato AVI'
echo '16) Convertir un video en formato OGV a formato AVI'
echo '17) Convertir un video en formato FLV a formato AVI'
echo '18) Convertir un video en formato MOV a formato AVI con una calidad óptima y alta compresión'
echo '19) Convertir sin pérdida de calidad (lossless) a formato AVI'
echo '20) Convertir un DVD a un video AVI con gran calidad'
echo '21) Quitar audio a un video'
echo '22) Modificar la velocidad de reproduccion de un video'
echo '23) Ver sintaxis general de Mencoder'
echo '24) Ver opciones de codificación de video de Mencoder'
echo '25) Ver opciones de codificación de audio de Mencoder'
echo '26) Ver los filtros de video de Mencoder'
echo '27) Ver manual de Mencoder'
echo '28) Salir del script'
echo '__________________________________________________'
}
function write_option
{
echo
echo 'Escribe una opción de 1 a 28:'
read write_option
}
#  1) Convertir un video a otro video en cuaquier formato:
function option_01
{
clear
echo 'CONVERTIR UN VIDEO CON UN FORMATO EN OTRO FORMATO'
echo
echo 'Introduce nombre de video de entrada:'
read video_input
echo
echo 'Introduce el nombre de video de salida:'
read video_output
mencoder $video_input -ovc copy -oac copy -o $video_output
}
#  2) Convertir un video a otro video en cuaquier formato con un escalado diferente // PENDIENTE PR LO DE LA SCALE
function option_02
{
clear
echo 'CONVERTIR UN VIDEO A OTRO FORMATO EN CUALQUIER FORMATO CON ESCALADO DIFERENTE'
echo
echo 'Introduce nombre de video de entrada:'
read video_input
echo
echo 'Introduce el nombre de video de salida:'
read video_output
echo
echo 'Ejemplo: en el caso de que scale=320:260'
  echo 'Width (Ancho): 320 pixels'
echo 'Height (Alto): 260 pixels'
        echo 'usted debe escribir lo que aparece entrecomillas "320:260"   '
echo
echo 'Introduzca los valores de escalado del video:'
read scale_value
        mencoder $video_input -ovc lavc -lavcopts vcodec=mpeg4 -oac pcm -vf scale=$scale_value -o $video_output
}
# 3)  Concatenar una serie de videos con el mismo formato en un video de salida:
function option_03
{
clear
echo 'CONCATENAR UNA SERIE DE VIDEOS CON EL MISMO FORMATO EN UN VIDEO DE SALIDA:'
echo
echo 'Ejemplo de lista de videos -> video 1 video 2 video 3 video 4 video N'
echo
echo 'Introduce los nombres de la lista de videos de entrada por orden y con un espacio en blanco de separacion entre si:'
read videos_input_list
echo
echo 'Introduce el nombre del video resultado de la concatenacion de videos:'
read video_output
echo
mencoder -ovc copy -oac copy $videos_input_list -o $video_output
}
# 4)  Cortar un fragmento de un video marcando el tiempo inicial y final o su peso en MB
function option_04
{
clear
echo 'CORTAR UN FRAGMENTO DE UN VIDEO MARCANDO EL TIEMPO INICIAL Y FINAL O SU PESO EN MB'
echo
echo 'Ejemplo de cortar fragmento de video usando segudos como referencia:'
echo
echo '$ mencoder video_input -ss 10 -endpos 55.5 -ovc copy -oac copy -o video_output'
echo
echo
echo 'Ejemplo de cortar fragmento de video usando minutos como referencia:'
echo
echo '$ mencoder video_input -ss 0:00 -endpos 59:20 -ovc copy -oac copy -o video_output'
echo
echo
echo 'Ejemplo de cortar fragmento  de video usando megas de diferencia:'
echo
echo 'mencoder -ovc copy -oac copy -ss 0 -endpos 700mb -o $video_output $video_input'
echo
echo
echo 'Introduce el nombre del video completo:'
read video_input
echo
echo 'Introduce el nombre del fragmento de video:'
read video_output
echo
echo 'Introduce la posicion inicial en segudos, minutos o MB del fragmento de video:'
read init_position
echo
echo 'Introduce la posicion final en segundos, minutos o MB del  fragmento de video:'
read end_position
echo
mencoder -ovc copy -oac pcm -ss $init_position -endpos $end_position -o $video_output $video_input
}
# 5)  Incrustar subtitulos a un video
function option_05
{
clear
echo 'INCRUSTAR SUBTITULOS A UN VIDEO'
echo
echo 'Introduce nombre de video sin subtítulos:'
read video_input
echo
echo 'Introduce nombre del archivo de subtítulos'''
read subtitles_file
echo
echo 'Introduce nombre de video subtitulado:'
read video_output
echo
mencoder -ovc lavc -oac mp3lame $video_input -o $video_output -sub $subtitles_file -subfont-text-scale 3
# mencoder $video_input -oac copy -ovc lavc -sub $subtitles_file -font /usr/share/fonts/truetype/freefont/FreeSansBold.ttf -subfont-autoscale 3 -ass -ass-color ffff8000 -ass-border-color 00000000 -ass-force-style Bold=1,Outline=1,Shadow=3,Fontsize=30 -fontconfig -subcp ISO-8859-1 -ass-line-spacing 0 -o $video_output
}
# 6)  Codificación de video en cualquier formato en otro video con un bitrate de superior
function option_06
{
clear
echo 'CODIFICACIÓN DE VIDEO EN CUALQUIER FORMATO EN OTRO VIDEO CON UN BITRATE SUPERIOR'
echo
echo 'Introduce nombre de video de entrada:'
read video_input
echo
echo 'Introduce el nombre de video de salida:'
read video_output
echo
mencoder $video_input -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2000:vhq -oac copy -o $video_output
}
# 7)  Arreglar videos en formato .avi con índice roto o interpolado debido a errores de flujo en video o/y audio
function option_07
{
clear
echo 'ARREGLAR VIDEOS EN FORMATO AVI CON INDICE ROTO O INTERPOLADO DEBIDO A ERRORES DE FLUJO EN VIDEO O/Y AUDIO'
echo
echo 'Introduce nombre de video de entrada:'
read video_input
echo
echo 'Introduce el nombre de video de salida:'
read video_output
echo
mencoder -idx $video_input.avi -ovc copy -oac copy -o $video_output.avi
}
# 8) Rotar un vídeo en cualquier formato
function option_08
{
clear
echo 'ROTAR LA IMAGEN DE UN VIDEO'
echo
echo 'Introduce el nombre del video de entrada:'
read video_input
echo
echo 'Introduce el nombre del video de salida:'
read video_output
echo
echo '_____________VALORES DE ROTACION DE IMAGEN DE VIDEO____________________'
echo 
echo 'Las opciones [0-3] son solo para videos horizontales (landscape)'
echo
echo '0 = Rotar 90 grados a la derecha e invertir'
echo '1 = Rotar 90 grados a la derecha'
echo '2 = Rotar 90 grados a la izquierda'
echo '3 = Rotar 90 grados a la izquierda e invertir'
echo
echo 'Las opciones [4-7] son solo para vídeos verticales (portrait):'
echo
echo '4 = Rotar vídeos verticales a la derecha 90° e invertir'
echo '5 = Rotar vídeos verticales a la derecha 90 grados'
echo '6 = Rotar vídeos verticales a la izquierda 90 grados'
echo '7 = Rotar vídeos verticales a la izquierda 90° e invertir'
echo
echo '8 = Volver al menu principal'
echo '________________________________________________________________________'
echo
echo 'Introduce el valor de rotación del video de 1 a 7:'
read rotate_value
echo
if [ $rotate_value -ge 0 ] && [ $rotate_value -le 7 ]; then
mencoder -vf rotate=$rotate_value -oac pcm -ovc lavc $video_input -o $video_output
else
        echo 'Valor de rotación de imagen de video no contemplado'
fi
}
# 9) Añadir audio a un video
function option_09
{
clear
echo '____________________MENÚ DE AÑADIR AUDIO A UN VIDEO ____________________'
echo 
echo '1 = AÑADIR ARCHIVO DE AUDIO .MP3 A UN VIDEO'
echo '2 = AÑADIR ARCHIVO DE AUDIO .WAV A UN VIDEO'
echo '________________________________________________________________________'
echo
echo
echo 'Nota: Sí el video tiene audio será sustituido por el audio que le añadamos y sí la pista de audio es mas larga que la duración del video se cortará donde acabe el video.
Añadir una pista de audio a un vídeo'
echo
echo 'Introduce una opción de 1 a 2:'
read option_audio_to_video
echo
if [ $option_audio_to_video -ge 0 ] && [ $option_audio_to_video -le 2 ]; then
case $option_audio_to_video in
1)
echo 'Introduce archivo de video de entrada:'
read  video_input
echo
echo 'Introduce archivo de audio MP3:'
read  audio_input_mp3
echo
echo 'Introduce archivo de video de salida:'
read video_output
echo
mencoder $video_input -o $video_output -ovc copy -oac copy -audiofile $audio_input_mp3
;;
2)
echo 'Introduce archivo de video de entrada:'
read  video_input
echo
echo 'Introduce archivo de audio WAV:'
read  audio_input
echo
echo 'Introduce archivo de video de salida:'
read video_output
echo
mencoder $video_input -o $video_output -ovc copy -oac mp3lame -audiofile $audio_input
;;
esac else
        echo 'Opción de añadir audio a un video no contemplada'
fi
}
# 10) Codificación de un video en 2 pasadas y con reducción del ruido de fondo'
function option_10
{
echo 'CODIFICACION DE UN VIDEO EN 2 PASADAS Y CON REDUCCION DEL RUIDO DE FONDO'
echo
echo 'Introduce nombre de video de entrada:'
read video_input
echo
echo 'Introduce el nombre de video de salida:'
read video_output
echo
mencoder $video_input -o $video_output -oac copy -ovc x264 -x264encopts  bitrate=3000 pass=2 nr=2000
}
 # 11) Crear un video con imágenes estáticas
function option_11
{
clear
echo 'CREACION UN VIDEO A PARTIR DE IMÁGENES ESTÁTICAS'
echo
echo '__________________MENÚ DE CREACION DE UN VIDEO A PARTIR DE IMAGENES ESTATICAS _____________________'
echo 
echo '1 = CREAR UN VIDEO A PARTIR DE IMÁGENES ESTÁTICAS'
echo '2 = CREAR UN VIDEO A PARTIR DE IMAGENES ESTATICAS REDIMENSIONANDO LAS IMAGENES CON EL MISMO TAMAÑO'
echo '__________________________________________________________________________________________________'
echo
echo
echo 'Introduce una opción de 1 a 2'
read option_images_to_video
echo
if [ $option_images_to_video -ge 0 ] && [ $option_images_to_video -le 2 ]; then
case $option_images_to_video in
1)
echo 'CREAR UN VIDEO A PARTIR DE IMÁGENES ESTÁTICAS'Á
echo   
echo 'Si fps = 1, cada imagen se verá durante 1 segundo y el video duraría 3 segundos'
echo
echo 'Introduce la extensión (jpg, jpeg, png, etc) de las imágenes:'
read image_ext
echo
echo 'Introduce el numero de frames por segundo (fps):' read fps_value
echo
echo 'Introduce el nombre del video de salida:'
read video_output
echo
mencoder mf://*.$image_ext -mf fps=$fps_value -ovc lavc -oac copy -o $video_output
;;
2)
echo 'CREAR UN VIDEO A PARTIR DE IMÁGENES ESTÁTICAS REDIMENSIONADO EL TAMAÑO DE LAS IMAGENES'
echo       
echo
echo 'Si fps = 1, cada imagen se verá durante 1 segundo y el video duraría 3 segundos.'
echo
echo 'Introduce la extensión (jpg, jpeg, png, etc) de las imágenes:'
read image_ext
echo
echo 'Introduce el numero de frames por segundo (fps):' read fps_value
echo
echo 'Introduce el ancho de las imágenes para su redimensionado:' read width_value
echo echo 'Introduce el alto de las imágenes para su redimensionado:' read height_value
echo echo 'Introduce el nombre del video de salida:'
read video_output
echo
mencoder mf://*.$image_ext -mf w=$width_value:h=$height_value:fps=$fps_value:type=$image_ext -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o $video_output
;;
esac
else
        echo 'Opción de convertir imágenes estáticas en un video no contemplada'
fi
}
# 12) Sincronización del video con el audio ligeramente desfasado
function option_12
{
clear
echo 'SINCRONIZACION DE VIDEO CON EL AUDIO LIGERAMENTE DESFASADO'
echo
echo 'Esto soluciona demoras en audio por retraso en el encabezado del vídeo.'
        echo 'Los valores positivos retrasan el audio, y los valores negativos retrasan el video.'
        echo 'Un valor -0.325 retrasa el video para que sincronice con el video'
echo
echo 'Introduce nombre de video de entrada:'
read video_input
echo
echo 'Introduce el nombre de video de salida:'
read video_output
echo
echo 'Introduce el valor de delay del video con signo - si es negativo:'
read audio_relay_value
mencoder $video_input -ovc copy -oac mp3lame -audio-delay $audio_relay_value -o $video_output
}
# 13) Convertir un video en formato MP4 a formato AVI
function option_13
{
clear
echo 'CONVERTIR UN VIDEO EN FORMATO MP4 A FORMATO AVI'
echo
echo 'Introduce nombre de video de entrada con la extensión MP4:'
read video_input
echo
echo 'Introduce el nombre de video de salida con la extensión AVI:'
read video_output
echo
        mencoder $video_input -of avi -oac lavc -ovc lavc -lavcopts acodec=ac3:abitrate=192:vcodec=mpeg4:v4mv:keyint=100:vbitrate=2000 -o $video_output
}
# 14) Convertir un video en formato MP4 a formato MPEG
function option_14
{
clear
echo 'CONVERTIR UN VIDEO EN FORMATO MP4 A FORMATO MPEG'
echo
echo 'Introduce nombre de video de entrada con la extensión MP4:'
read video_input
echo
echo 'Introduce el nombre de video de salida con la extensión MPEG:'
read video_output
echo
        mencoder $video_input -of mpeg -oac lavc -ovc lavc -lavcopts acodec=ac3:abitrate=192:vcodec=mpeg2video:vhq:keyint=32:vbitrate=2000 -ofps 25 -o $video_output
}
# 15) Convertir un video en formato WMV a formato AVI
function option_15
{
clear
echo 'CONVERTIR UN VIDEO EN FORMATO WMV A FORMATO AVI'
echo
echo 'Introduce nombre de video de entrada con la extensión WMV:'
read video_input
echo
echo 'Introduce el nombre de video de salida con la extensión AVI:'
read video_output
echo
        mencoder $video_input -ofps 23.976 -ovc lavc -oac copy -o $video_output
}
# 16) Convertir un video en formato OGV a formato AVI
function option_16
{
clear
echo '____________________MENÚ DE CONVERTIR VIDEO OGV EN AVI ____________________'
echo 
echo '1 = CONVERTIR VIDEO OGV EN AVI'
echo '2 = CONVERTIR VIDEO OGV EN AVI CON MJPEG'
echo '________________________________________________________________________'
echo
echo
echo
echo 'Introduce una opción de 1 a 2:'
read option_ogv_to_avi
echo
if [ $option_ogv_to_avi -ge 0 ] && [ $option_ogv_to_avi -le 2 ]; then
case $option_ogv_to_avi in
1)
echo 'Introduce archivo de video de entrada con la extensión OGV:'
read  video_input
echo
echo 'Introduce archivo de video de salida con la extensión AVI:'
read video_output
echo
mencoder $video_input -ovc xvid -oac mp3lame -xvidencopts pass=1 -o $video_output
;;
2)
echo 'Introduce archivo de video de entrada con la extensión OGV:'
read  video_input
echo
echo 'Introduce archivo de video de salida con la extensión AVI:'
read video_output
echo
mencoder -idx $video_input -ovc lavc -oac pcm -lavcopts vcodec=mjpeg -o $video_output
;;
esac else
        echo 'Opción de añadir audio a un video no contemplada'
fi
}

# 17) Convertir un video en formato FLV a formato AVI
function option_17
{
clear
echo 'CONVERTIR UN VIDEO EN FORMATO FLV A FORMATO AVI'
echo
echo 'Introduce nombre de video de entrada con extensión FLV:'
read video_input
echo
echo 'Introduce el nombre de video de salida con la extensión AVI:'
read video_output
echo
        mencoder -oac mp3lame -lameopts cbr=128 -ovc xvid -xvidencopts bitrate=1200 $video_input -o $video_output
}
# 18) Convertir un video en formato MOV a formato AVI
function option_18
{
clear
echo 'CONVERTIR UN VIDEO EN FORMATO MOV A FORMATO AVI'
echo
echo 'Introduce nombre de video de entrada con la extensión MOV:'
read video_input
echo
echo 'Introduce el nombre de video de salida con la extensión AVI:'
read video_output
echo
        # Primera pasada
mencoder $video_input -ovc xvid -xvidencopts bitrate=600:pass=1 -vf scale=320:240 -oac mp3lame -lameopts abr:br=64 -o $video_output
# Segunda pasada
mencoder $video_input -ovc xvid -xvidencopts bitrate=600:pass=2 -vf scale=320:240 -oac mp3lame -lameopts abr:br=64 -o $video_output
}
# 19) Convertir sin pérdida de calidad (lossless) a formato AVI
function option_19
{
clear
echo 'CONVERTIR VIDEO A FORMATO AVI SIN PÉRDIDA DE CALIDAD'
echo
echo 'Introduce el nombre del video de entrada:'
read video_input
echo
echo 'Introduce el nombre del video de salida con la extensión AVI:'
read video_output
echo
mencoder -ovc lavc -oac pcm -lavcopts vcodec=ffv1 $video_input -o $video_output
}
# 20) Convertir un DVD a un video AVI con gran calidad'
function option_20
{
clear
echo 'CONVERTIR DVD A FORMATO AVI Y MP3 EN 2 PASADAS'
echo
echo 'ADVERTENCIA: MENCODER NO CONVIERTE DVDS ENCRIPTADOS'
echo
echo 'Introduce el nombre de video de salida con extensión AVI:'
read video_output
mencoder dvd:// -oac mp3lame -lameopts cbr:br=128:vol=5 -srate 44100 -ovc xvid -xvidencopts pass=1 -o /dev/null
mencoder dvd:// -oac mp3lame -lameopts cbr:br=128:vol=5 -srate 44100 -ovc xvid -xvidencopts pass=2:bitrate=1500 -o $video_output
}
# 21) Quitar audio a un video
function option_21
{
clear
echo 'QUITAR AUDIO A UN VIDEO'
echo
echo 'Introduce el nombre del video de entrada'
read  video_input
echo
echo 'Introduce el nombre del video de salida'
read  video_output
echo
mencoder -ovc copy -nosound $video_input -o $video_output
}
# 22) Modificar la velocidad de reproduccion de un video
function option_22
{
clear
echo 'MODIFICAR LA VELOCIDAD DE UN VIDEO'
echo 
echo 'Introduce el nombre del video de origen:'
read video_input
echo
echo 'Introduce el nombre del video de salida:'
read video_output
echo
echo 'Ejemplo: Si el valor de la velocidad es 2, el video resultante se reproducirá el doble de rapido'
echo
echo 'Introduce la velocidad del video:'
read speed_value
echo
mencoder -speed $speed_value -o $video_output -ovc lavc -oac pcm $video_input
}
# 23) Ver sintaxis general de Mencoder
function option_23
{
clear
echo 'SINTAXIS GENERAL DE MENCODER'
echo
echo 'mencoder input.ogg -oac [codec] [codec opts] -ovc  [codec] [codec opts] -vf [filter opts] -other_opts [other_opts opt] -o output.avi'
}
# 24) Ver opciones de codificación de video de Mencoder
function option_24
{
mencoder -ovc help
}
# 25) Ver opciones de codificación de audio de Mencoder
function option_25
{
mencoder -oac help
}
# 26) Ver los filtros de video de Mencoder'
function option_26
{
mencoder -vf help
}
# 27) Ver manual de Mencoder'
function option_27
{
man mencoder
}
# 28) Salir del script
function option_28
{
echo 'Salir del script'
}
write_option=0
go_out=28
while [ $write_option -ne $go_out ];
do 
   clear
   menu
   write_option
     
   if [ $write_option -ge 1 ] && [ $write_option -le 28 ];
   then 
      clear
      case $write_option in   # Acciones para las diferentes opciones del menu
         1)
         option_01
         ;;     
         2)
option_02
         ;;
         3)
option_03
         ;;
         4)
         option_04
         ;;
         5)
         option_05
         ;;
         6)
         option_06
;;
7)
         option_07
;;
8)
         option_08
;;
9)
         option_09
;;
10)
         option_10
;;
11)
         option_11
;;
12)
         option_12
;;
13)
         option_13
;;
14)
         option_14
;;
15)
         option_15
;;
16)
         option_16
;;
17)
         option_17
;;
18)
         option_18
;;
19)
  option_19
;;
20)
         option_20
;;
21)
         option_21
;;
22)
         option_22
;;
23)
         option_23
;;
24)
         option_24
;;
25)
         option_25
;;
26)
         option_26
;;
27)
         option_27
;;
28)
         option_28
;;
      esac
   else
      echo '¡No ha introducido una opcion correcta!'
   fi
   echo
   echo 'Pulse una tecla...'
   read
done
Uso:

1) Copia el script en la siguiente ruta /usr/local/bin/mencoder.sh para poder ejecutarlo desde cualquier directorio
2) Concede permisos de ejecución en modo root:
# chmod + x mencoder.sh
3) Ejecuta el script en modo usuario:
$ bash mencoder.sh

[1] http://www.mplayerhq.hu/DOCS/HTML/en/index.html
[2] http://www.mplayerhq.hu/DOCS/HTML/es/index.html
[3] http://www.mplayerhq.hu/design7/news.html