Fundamentos de aplicativos de mídia

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Trabalhar com mídia muitas vezes exige mudar as 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ê vai conhecer as ferramentas usadas para instalá-los rapidamente.

Primeiro, descrevemos o uso básico de dois utilitários de mídia de linha de comando comuns: Shaka Packager e FFmpeg (links em inglês) para ajudar você a instalar as ferramentas rapidamente. Por que abordar duas inscrições? Embora ambos sejam poderosos e úteis sozinhos, nem tudo o que era necessário para preparar a mídia para a Web. Também criamos o Conversão de mídia e criptografia de mídia páginas que mostram muitas operações mais 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 duas das mais comuns e poderosas. Outras opções incluem a GUI aplicativos Miro, HandBrake e VLC (links em inglês). Também há a codificação/transcodificação serviços, como Zencoder, Amazon Elastic Encoder e API Google Transcoder.

Empacotador Shaka

O Shaka Packager é um SDK de empacotamento de mídia sem custo financeiro. Se você estava usando um player de mídia do seu site, o Shaka Packager é o que você usaria para preparar os arquivos. Ela oferece suporte à conversão para os dois protocolos de streaming de vídeo mais comuns: dinâmico Adaptive Streaming over HTTP (DASH) ou HTTP Live Streaming (HLS). Shaka O Packager oferece suporte aos principais recursos de segurança: criptografia comum e Widevine Digital gerenciamento de direitos autorais (DRM, na sigla em inglês). Ele também pode lidar com streaming ao vivo e vídeo sob demanda.

Apesar do que diz no pacote, esse utilitário é para mais do que C++ desenvolvedores de aplicativos. Você pode usá-lo ao mesmo tempo como uma biblioteca para a criação de software de mídia e como um utilitário de linha de comando para preparar arquivos de mídia para reprodução na Web. É o última capacidade que é útil para nós aqui. Para criadores de mídia na Web, Shaka Packager é a única maneira de fazer algumas tarefas sem gastar dinheiro aplicativos comerciais caros.

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

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

Não é bem isso que você recebe ao digitar packager -help. Este exemplo é mais fáceis de entender, e isso reflete os exemplos na Documentação do Shaaka Packager (em inglês). Há vários stream_descriptor no padrão. Apesar de não mostrarmos isso, você pode manipular o vídeo e streams de áudio de um arquivo separadamente em um único comando.

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

packager stream_descriptor [stream_descriptor-n] [flags]

packager input=glocken.mp4                       --dump_stream_info

A resposta ao comando é:

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 observar algumas coisas. A altura e a largura estão corretas para Full HD. codecs de áudio e vídeo estão entre os codecs preferidos para seus tipos de contêiner, AAC para áudio e H264 para vídeo. Os streams são identificados números grandes. Eles são úteis em operações que manipulam o áudio e o vídeo separadamente.

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

FFmpeg

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

Este é o padrão básico de um comando FFmpeg:

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

Assim como o Shaka Packager, esse aplicativo pode lidar com vários streams. Alguns de seus são usadas em diversos locais e manipulam a saída do arquivo de forma diferente dependendo de onde eles estão no comando. Lembre-se disso quando você consulte as perguntas do FFmpeg no Stack Overflow e sites semelhantes.

Compararemos novamente o padrão básico com o exemplo de exibição de arquivos e as características determinantes.

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

    ffmpeg                                     -i glocken.mp4

Além das informações solicitadas, isso também gera uma mensagem de erro como mostrado no exemplo abaixo. Isso porque esse é tecnicamente um erro do FFmpeg. Nós a usamos porque ela mostra informações que são 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

Como instalar aplicativos com o Docker

Se quiser acompanhar e testar nossos comandos, você pode instalar o as ferramentas necessárias manualmente ou use o caminho mais fácil e use o Docker. Sugerimos usar Docker, porque isso economizará muito tempo. Além disso, forneceu as instruções para configurá-lo rapidamente.

  1. Comece criando um novo diretório em algum lugar do computador com o nome media-tools. use o nome que quiser. Observe que as instruções a seguir presume 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 manterá o diretório media fora do contexto de build. Isso é importante porque media é onde serão armazenados os arquivos em que planejamos fazer operações. algumas delas podem ser muito grandes. Colocar Dockerfile diretamente o media-tools desacelera a criação da imagem caso você a recrie estrada, talvez para alterar 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 verificar se tudo deu certo 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á experimentou usar o Shaka Packager e o FFmpeg, pode continuar os conceitos básicos, a seguir, Noções básicas de streaming de mídia.