Fundamentos de aplicativos de mídia

Derek herman
Derek Herman
Joe medley
Joe Medley

Trabalhar com mídia geralmente requer a mudança das características dos arquivos de mídia, como taxa de bits ou resolução. Encontrar uma maneira simples de começar pode ser bastante intimidante. Nesta página, você aprenderá sobre as ferramentas usadas e como instalá-las rapidamente.

Primeiro, descrevemos o uso básico de dois utilitários de mídia de linha de comando comuns: Shaka Packager e FFmpeg. Em seguida, ajudamos você a instalar rapidamente as ferramentas. Por que abordar dois aplicativos? Embora ambas sejam poderosas e úteis sozinhas, nenhuma faz tudo o que é necessário para preparar a mídia para a Web. Também criamos as páginas Conversão de mídia e Criptografia de mídia, que mostram muitas outras operações comuns com esses dois aplicativos.

Esses aplicativos não são as únicas opções disponíveis para tarefas de manipulação de arquivos, mas são as duas mais comuns e eficientes. Outras opções incluem os aplicativos de GUI Miro, HandBrake e VLC. Há também serviços de codificação/transcodificação, como Zencoder, Amazon Elastic Encoder e API Google Transcoder.

Shaka Packager

O Shaka Packager é um SDK de empacotamento de mídia sem custo financeiro. Se você estivesse usando um player de mídia no seu site, o Shaka Packager é o que você usaria para preparar os arquivos. Ela é compatível com a conversão dos dois protocolos de streaming de vídeo mais comuns: Dynamic Streaming adaptável via HTTP (DASH) ou HTTP Live Streaming (HLS). O Shaka Packager oferece suporte aos principais recursos de segurança: criptografia comum e gerenciamento de direitos digitais (DRM, na sigla em inglês) do Widevine. Ele também pode lidar com transmissões ao vivo e vídeo sob demanda.

Apesar do que está escrito no pacote, esse utilitário é para mais do que desenvolvedores C++. Você pode usá-lo como uma biblioteca para criar software de mídia e como um utilitário de linha de comando para preparar arquivos de mídia para reprodução na Web. É a última capacidade que nos é útil aqui. Na verdade, para os criadores de mídia da Web, o Shaka Packager é a única maneira de realizar algumas tarefas sem gastar dinheiro com aplicativos comerciais caros.

Este é o padrão básico para um comando Shaka Packager:

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

Esse não é o resultado esperado quando você digita packager -help. Esse exemplo é mais fácil de entender e reflete os exemplos da documentação do Shaka Packager. Observe que há vários itens stream_descriptor no padrão. Embora não seja mostrado, é possível manipular os streams de vídeo e áudio de um arquivo separadamente com um único comando.

Compare esse padrão básico com um uso simples que mostra as características do arquivo. No exemplo, alinhamos as partes equivalentes.

packager stream_descriptor [stream_descriptor-n] [flags]

packager input=glocken.mp4                       --dump_stream_info

O comando gera o seguinte:

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

Procure as características discutidas em Noções básicas sobre arquivos de mídia e observe alguns aspectos. A altura e a largura estão corretas para Full HD, e os codecs de áudio e vídeo estão entre os codecs preferidos para os tipos de contêiner, AAC para áudio e H264 para vídeo. Observe também que os streams são identificados por números. Eles são úteis para operações que manipulam o áudio e o vídeo separadamente.

A saída acima não mostra a taxa de bits. Apesar do que está faltando, essa saída é mais fácil de ler, então vamos usá-la sempre que possível. Quando precisamos de informações que o Shaka Packager não consegue acessar, como a taxa de bits, usamos o FFmpeg.

FFmpeg

O FFmpeg também é um aplicativo sem custo financeiro para gravar, converter e transmitir arquivos de mídia. Os recursos dele não são melhores nem piores que os do Shaka Packager. São apenas diferentes.

O padrão básico de um comando FFmpeg tem a seguinte aparência:

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

Assim como o Shaka Packager, esse aplicativo pode lidar com vários fluxos. Algumas das opções são usadas em vários locais e manipulam a saída do arquivo de maneira diferente, dependendo de onde elas estão no comando. Esteja ciente disso ao analisar as perguntas do FFmpeg no Stack Overflow e em sites semelhantes.

Vamos comparar novamente o padrão básico com o exemplo de exibição das características de um arquivo.

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

    ffmpeg                                     -i glocken.mp4

Além das informações solicitadas, ele também imprime uma mensagem de erro, conforme o exemplo abaixo. Isso porque este é tecnicamente um uso incorreto do FFmpeg. Nós o usamos porque ele exibe informações importantes para nós.

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 aplicativos com o Docker

Se você pretende acompanhar e testar nossos comandos, instale as ferramentas necessárias manualmente ou escolha o caminho mais fácil e use o Docker. Sugerimos usar o Docker, porque isso poupará muito tempo. Além disso, fornecemos instruções para você configurar rapidamente.

  1. Comece criando um novo diretório em algum lugar no computador com o nome media-tools. Você pode usar o nome que quiser. As instruções abaixo supõem que você está usando media-tools como o nome do diretório.

  2. Crie um diretório docker e media dentro de media-tools. Isso vai manter o diretório media fora do contexto do build. Isso é importante porque media é onde são armazenados os arquivos em que planejamos realizar operações, e alguns deles podem ser muito grandes. Colocar o Dockerfile diretamente em media-tools atrasará a criação da imagem se você precisar recriá-la no futuro, talvez para mudar as versões instaladas.

  3. Crie /media-tools/docker/Dockerfile e adicione estas instruções de build:

    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. Crie a imagem:

    docker build -t media-tools ./docker
    
  5. Execute a imagem como um shell interativo. No Linux:

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

    No Windows:

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

Ao executar a imagem, você pode verificar as versões do FFmpeg e do Shaka Packager para validar se tudo foi bem-sucedido executando ffmpeg -version e packager --version. O resultado será semelhante a este:

/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

Agora que você já tentou usar o Shaka Packager e o FFmpeg, continue aprendendo os conceitos básicos. A seguir, confira Princípios básicos de streaming de mídia.