Conceptos básicos de las aplicaciones multimedia

Derek Herman
Derek Herman
Joe Medley
Joe Medley

A menudo, trabajar con contenido multimedia requiere cambiar las características de los archivos multimedia, como la tasa de bits o la resolución. Encontrar una manera sencilla de comenzar puede ser bastante intimidante. En esta página, aprenderás sobre las herramientas usadas y cómo instalarlas rápidamente.

Primero, describimos el uso básico de dos utilidades multimedia comunes de línea de comandos: Shaka Packager y FFmpeg. Luego, te ayudamos a instalar las herramientas con rapidez. ¿Por qué debería abarcar dos aplicaciones? Si bien ambos son potentes y útiles por sí solos, tampoco todo lo necesario para preparar el contenido multimedia para la Web. También creamos las páginas Conversión de medios y Encriptación de medios, que muestran muchas operaciones más comunes con estas dos aplicaciones.

Estas aplicaciones no son las únicas opciones disponibles para las tareas de manipulación de archivos, pero son dos de las más comunes y potentes. Otras opciones incluyen las aplicaciones de la GUI Miro, HandBrake y VLC. También existen servicios de codificación y transcodificación, como Zencoder, Amazon Elastic Encoder y la API de Google Transcoder.

Empaquetador de Shaka

Shaka Packager es un SDK de empaquetado multimedia gratuito. Si usas un reproductor multimedia en tu sitio, Shaka Packager es lo que usarías para preparar los archivos. Admite la conversión para los dos protocolos de transmisión de video por Internet más comunes: la transmisión adaptable y dinámica a través de HTTP (DASH) o la transmisión en vivo HTTP (HLS). Shaka Packager admite funciones clave de seguridad: la encriptación común y la administración de derechos digitales (DRM) de Widevine. También admite transmisiones en vivo y videos on demand.

Más allá de lo que diga en el paquete, esta utilidad no solo es útil para desarrolladores de C++. Puedes usarla como biblioteca para compilar software de contenido multimedia y como utilidad de línea de comandos que permite preparar archivos multimedia para la reproducción web. Esta última capacidad nos resulta útil. De hecho, para los creadores de medios web, Shaka Packager es la única forma de realizar algunas tareas sin invertir dinero en aplicaciones comerciales costosas.

Este es el patrón básico de un comando de Shaka Packager:

packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]

Esto no es lo que obtienes si escribes packager -help. Este ejemplo es más fácil de razonar y refleja los ejemplos de la documentación de Shaka Packager. Ten en cuenta que hay varios elementos stream_descriptor en el patrón. Aunque no se muestra en la lista, puedes manipular las transmisiones de video y audio de un archivo por separado con un solo comando.

Compara este patrón básico con un uso simple que muestra las características del archivo. En el ejemplo, alineamos partes equivalentes.

packager stream_descriptor [stream_descriptor-n] [flags]

packager input=glocken.mp4                       --dump_stream_info

El resultado del comando es el siguiente:

File "glocken.mp4":
Found 2 stream(s).
Stream [0] type: Video
 codec_string: avc1.640028
 time_scale: 30000
 duration: 300300 (10.0 seconds)
 is_encrypted: false
 codec: H264
 width: 1920
 height: 1080
 pixel_aspect_ratio: 1:1
 trick_play_factor: 0
 nalu_length_size: 4

Stream [1] type: Audio
 codec_string: mp4a.40.2
 time_scale: 48000
 duration: 481280 (10.0 seconds)
 is_encrypted: false
 codec: AAC
 sample_bits: 16
 num_channels: 2
 sampling_frequency: 48000
 language: eng
 seek_preroll_ns: 20833

Busca las características que se analizaron en Conceptos básicos de los archivos multimedia y observa algunos aspectos. La altura y el ancho son correctos para Full HD, y los códecs de audio y video se encuentran entre los códecs preferidos para sus tipos de contenedor, AAC para audio y H264 para video. Observa también que las transmisiones se identifican con números. Estos son útiles para operaciones que manipulan el audio y el video por separado.

Observa que el resultado anterior no muestra la tasa de bits. A pesar de lo que falta, este resultado es más fácil de leer, por lo que lo usamos siempre que podamos. Cuando necesitamos información que Shaka Packager no puede obtener, como la tasa de bits, usamos FFmpeg.

FFmpeg

FFmpeg también es una aplicación gratuita para grabar, convertir y transmitir archivos multimedia. Sus capacidades no son mejores ni peores que las de Shaka Packager. Solo que son diferentes.

El patrón básico de un comando FFmpeg se ve de la siguiente manera:

ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output

Al igual que Shaka Packager, esta aplicación puede manejar múltiples transmisiones. Algunas de sus opciones se usan en varias ubicaciones y manipulan el resultado del archivo de manera diferente según en qué parte del comando se encuentren. Ten en cuenta esto cuando revises las preguntas de FFmpeg en Stack Overflow y sitios similares.

Volveremos a comparar el patrón básico con el ejemplo para mostrar las características del archivo.

    ffmpeg [GeneralOptions] [InputFileOptions] -i input        [OutputFileOptions] output

    ffmpeg                                     -i glocken.mp4

Además de la información que solicitamos, también se imprime un mensaje de error, como se muestra en el siguiente ejemplo. Eso se debe a que, técnicamente, este es un uso incorrecto de FFmpeg. Lo usamos porque muestra información que nos interesa.

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.17.100
  Duration: 00:01:47.53, start: 0.000000, bitrate: 10715 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 10579 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

Instalar aplicaciones con Docker

Si piensas seguir el proceso y probar nuestros comandos, puedes instalar las herramientas requeridas de forma manual o usar Docker por la ruta fácil. Sugerimos usar Docker, porque esto te ahorrará mucho tiempo. Además de eso, proporcionamos las instrucciones para que puedas configurarlo con rapidez.

  1. Para comenzar, crea un directorio nuevo en algún lugar de tu computadora llamado media-tools. Puedes usar el nombre que desees; solo ten en cuenta que, en las siguientes instrucciones, se presupone que usas media-tools como nombre del directorio.

  2. Crea un directorio docker y media dentro de media-tools. Esto mantendrá tu directorio media fuera del contexto de compilación. Esto es importante porque media es el lugar en el que se almacenan los archivos en los que planeamos realizar operaciones, y algunos de ellos podrían ser bastante grandes. Si colocas el Dockerfile directamente en media-tools, la compilación de la imagen será más lenta si vuelves a compilarla en el futuro, tal vez para cambiar las versiones instaladas.

  3. Crea /media-tools/docker/Dockerfile y agrega las siguientes instrucciones de compilación:

    FROM google/shaka-packager:release-v2.4.3 as packager
    FROM jrottenberg/ffmpeg:4.3.2-alpine38
    COPY --from=packager /usr/bin /usr/bin
    ENTRYPOINT  ["sh"]
    
  4. Compila la imagen:

    docker build -t media-tools ./docker
    
  5. Ejecuta la imagen como una shell interactiva. En Linux:

    docker run -w /media -v ${PWD}/media:/media -it --rm media-tools
    /media #
    

    En Windows:

    docker run -w /media -v %cd%/media:/media -it --rm media-tools
    /media #
    

Mientras ejecutas la imagen, puedes verificar las versiones de FFmpeg y Shaka Packager para validar que todo se haya realizado correctamente mediante la ejecución de ffmpeg -version y packager --version. El resultado debería verse así:

/media # ffmpeg -version
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 6.4.0 (Alpine 6.4.0)
configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxcb --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libbluray --enable-libzmq --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --enable-libsrt --enable-libaribb24 --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
libavutil      56. 51.100 / 56. 51.100
libavcodec     58. 91.100 / 58. 91.100
libavformat    58. 45.100 / 58. 45.100
libavdevice    58. 10.100 / 58. 10.100
libavfilter     7. 85.100 /  7. 85.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  7.100 /  5.  7.100
libswresample   3.  7.100 /  3.  7.100
libpostproc    55.  7.100 / 55.  7.100
/media # packager --version
packager version v2.4.3-dd9870075f-release

Ahora que ya probaste usar Shaka Packager y FFmpeg, puedes seguir aprendiendo los conceptos básicos en este artículo de la sección Conceptos básicos de la transmisión de contenido multimedia.