Conversión de medios

Derek Herman
Derek Herman
Joe Medley
Joe Medley

En este artículo, aprenderemos algunos comandos comunes para convertir y manipular características específicas de los archivos multimedia. Aunque intentamos mostrar operaciones equivalentes para todos los procedimientos, no todas las operaciones son posibles en ambas aplicaciones.

En muchos casos, los comandos que se muestran pueden combinarse en una sola operación de línea de comandos, lo que sucede cuando se usan realmente. Por ejemplo, no hay nada que te impida configurar la tasa de bits de un archivo de salida en la misma operación que una conversión de archivo. En este artículo, a menudo mostramos estas operaciones como comandos separados por motivos de claridad.

La conversión se realiza con estas aplicaciones:

Características de la pantalla

Tanto Shaka Packager como FFmpeg se pueden usar para inspeccionar el contenido de un archivo multimedia y, luego, mostrar las características de una transmisión. Sin embargo, ambos proporcionan resultados diferentes para el mismo contenido multimedia.

Características con Shaka Packager

packager input=glocken.mp4 --dump_stream_info

El resultado se verá de la siguiente manera:

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

Características con FFmpeg

ffmpeg -i glocken.mp4

El resultado se verá de la siguiente manera:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
  Duration: 00:00:10.03, start: 0.000000, bitrate: 8063 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 7939 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, 127 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
At least one output file must be specified

Demux (separa) las transmisiones de audio y video

Shaka Packager requiere demuxing cuando se convierten archivos. Esto también es necesario para usar frameworks multimedia.

Demuxing de Shaka Packager

MP4

packager input=myvideo.mp4,stream=video,output=myvideo_video.mp4
packager input=myvideo.mp4,stream=audio,output=myvideo_audio.m4a

o:

packager \
  input=myvideo.mp4,stream=video,output=myvideo_video.mp4 \
  input=myvideo.mp4,stream=audio,output=myvideo_audio.m4a

WebM

packager \
  input=myvideo.webm,stream=video,output=myvideo_video.webm \
  input=myvideo.webm,stream=audio,output=myvideo_audio.webm

Demuxing de FFmpeg

MP4

ffmpeg -i myvideo.mp4 -vcodec copy -an myvideo_video.mp4
ffmpeg -i myvideo.mp4 -acodec copy -vn myvideo_audio.m4a

WebM

ffmpeg -i myvideo.webm -vcodec copy -an myvideo_video.webm
ffmpeg -i myvideo.webm -acodec copy -vn myvideo_audio.webm

Remux (combina) las transmisiones de audio y video.

En algunos casos, deberás combinar el audio y el video en un solo contenedor. Especialmente cuando no se usa un framework de contenido multimedia. Esto es algo que FFmpeg puede controlar bastante bien y que Shaka Packager no admite actualmente.

ffmpeg -i myvideo_video.webm -i myvideo_audio.webm -c copy myvideo.webm

Cambia las características

Tasa de bits

En el caso de FFmpeg, podemos hacerlo mientras convertimos a .mp4 o .webm.

ffmpeg -i myvideo.mov -b:v 350K myvideo.mp4
ffmpeg -i myvideo.mov -vf setsar=1:1 -b:v 350K myvideo.webm

Dimensiones (resolución)

ffmpeg -i myvideo.webm -s 1920x1080 myvideo_1920x1080.webm

File type

Shaka Packager no puede procesar archivos .mov, por lo que no se puede usar para convertir archivos de ese formato.

.mov a .mp4

ffmpeg -i myvideo.mov myvideo.mp4

.mov a .webm

ffmpeg -i myvideo.mov myvideo.webm

Sincroniza audio y video

Para asegurarte de que el audio y el video se sincronicen durante la reproducción, inserta fotogramas clave.

ffmpeg -i myvideo.mp4 -keyint_min 150 -g 150 -f webm -vf setsar=1:1 out.webm

MP4/H.264

ffmpeg -i myvideo.mp4 -c:v libx264 -c:a copy myvideo.mp4

Audio para un MP4

ffmpeg -i myvideo.mp4 -c:v copy -c:a aac myvideo.mp4

WebM/VP9

ffmpeg -i myvideo.webm -v:c libvpx-vp9 -v:a copy myvideo.webm

Audio para un archivo WebM

ffmpeg -i myvideo.webm -v:c copy -v:a libvorbis myvideo.webm
ffmpeg -i myvideo.webm -v:c copy -v:a libopus myvideo.webm

Video on demand y transmisión en vivo

Hay dos tipos de protocolos de transmisión que demostraremos en este artículo. La primera es la transmisión adaptable y dinámica a través de HTTP (DASH), que es una técnica de transmisión de tasa de bits adaptable y un método basado en estándares web para presentar video on demand. El segundo es HTTP Live Streaming (HLS), que es el estándar de Apple para transmisión en vivo y video on demand para la Web.

DASH/MPD

En este ejemplo, se genera el archivo de salida de la descripción de presentación multimedia (MPD) a partir de las transmisiones de audio y video.

packager \
  input=myvideo.mp4,stream=audio,output=myvideo_audio.mp4 \
  input=myvideo.mp4,stream=video,output=myvideo_video.mp4 \
  --mpd_output myvideo_vod.mpd

HLS

Estos ejemplos generan un archivo de salida M3U8 a partir de las transmisiones de audio y video, que es una playlist multimedia con codificación UTF-8.

ffmpeg -i myvideo.mp4 -c:a copy -b:v 8M -c:v copy -f hls \
  -hls_time 10 -hls_list_size 0 myvideo.m3u8

O BIEN:

packager \
  'input=myvideo.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
  'input=myvideo.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
  --hls_master_playlist_output="master_playlist.m3u8"

Ahora que esperamos tener una buena comprensión de cómo convertir archivos, podemos basarnos en lo que aprendimos en este artículo y aprender sobre la encriptación de contenido multimedia a continuación.