O trabalho 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 intimidador. Nesta página, você vai aprender sobre as ferramentas usadas e como instalá-las rapidamente.
Primeiro, descrevemos o uso básico de dois utilitários de mídia comuns de linha de comando: Shaka Packager e FFmpeg. Em seguida, ajudamos você a instalar as ferramentas rapidamente. Por que abordar duas aplicações? Embora ambos sejam poderosos e úteis por si sós, nenhum deles tem tudo o que é necessário para preparar mídia para a Web. Também criamos as páginas Conversão de mídia e Criptografia de mídia, que mostram muitas 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 dois dos mais comuns e poderosos. Outras opções incluem os aplicativos de GUI Miro, HandBrake e VLC. Também há serviços de codificação/transcodificação como o Zencoder, o Amazon Elastic Encoder e a 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 seria usado para preparar os arquivos. Ele oferece suporte à conversão dos dois protocolos de streaming de vídeo mais comuns: o Dynamic Adaptive Streaming over HTTP (DASH) ou o HTTP Live Streaming (HLS). O Shaka Packager oferece suporte a recursos de segurança importantes: criptografia comum e gerenciamento de direitos digitais (DRM) da Widevine. Ele também pode lidar com streaming ao vivo e vídeo sob demanda.
Apesar do que está escrito no pacote, esse utilitário é para mais do que desenvolvedores C++. Ela pode ser usada como uma biblioteca para criar softwares de mídia e como um utilitário de linha de comando para preparar arquivos de mídia para reprodução na Web. É a capacidade mais recente que é útil para nós aqui. Na verdade, para criadores de mídia da Web, o Shaka Packager é a única maneira de realizar algumas tarefas sem gastar dinheiro em aplicativos comerciais caros.
Confira o padrão básico de um comando do Shaka Packager:
packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]
Isso não é exatamente o que você vai receber se digitar packager -help
. Esse exemplo é
mais fácil de entender e reflete os exemplos na
documentação do Shaka Packager. Há vários itens stream_descriptor
no padrão. Embora não mostremos isso, é possível manipular os streams de vídeo
e áudio de um arquivo separadamente em um único comando.
Compare esse padrão básico com um uso simples que mostra as características do arquivo. No exemplo, alinhamos 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 de arquivos de mídia e observe algumas coisas. A altura e a largura estão corretas para full HD, e os codecs de áudio e vídeo estão entre os preferidos para os tipos de contêiner, AAC para áudio e H264 para vídeo. Observe também que os fluxos são identificados com 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 o bitrate. Apesar do que está faltando, essa saída é mais fácil de ler, então a usamos sempre que possível. Quando precisamos de informações que o Shaka Packager não consegue, como o bitrate, usamos o FFmpeg.
FFmpeg
O FFmpeg também é um aplicativo sem custo financeiro para gravação, conversão e streaming de arquivos de mídia. Os recursos dele não são melhores nem piores do que os do Shaka Packager. Elas são diferentes.
O padrão básico de um comando FFmpeg é assim:
ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output
Assim como o Shaka Packager, esse aplicativo pode processar vários streams. 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. Tenha isso em mente ao procurar perguntas sobre o FFmpeg no Stack Overflow e em sites semelhantes.
Vamos comparar novamente o padrão básico com o exemplo para mostrar as características do arquivo.
ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output
ffmpeg -i glocken.mp4
Além das informações solicitadas, isso também imprime uma mensagem de erro, conforme mostrado no exemplo abaixo. Isso ocorre porque é tecnicamente um uso incorreto do FFmpeg. Usamos porque ele mostra informações importantes.
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ê planeja seguir e testar nossos comandos, instale as ferramentas necessárias manualmente ou use o Docker. Sugerimos o uso do Docker, porque isso vai economizar muito tempo. Além disso, fornecemos instruções para você configurar tudo rapidamente.
Comece criando um novo diretório em algum lugar do computador chamado
media-tools
. Você pode usar qualquer nome, mas as instruções a seguir assumem que você está usandomedia-tools
como o nome do diretório.Crie um diretório
docker
emedia
dentro demedia-tools
. Isso vai manter seu diretóriomedia
fora do contexto de build. Isso é importante porquemedia
é onde os arquivos são armazenados para operações, e alguns deles podem ser muito grandes. Colocar oDockerfile
diretamente emmedia-tools
vai atrasar a criação da imagem se você precisar recriar a imagem no futuro, talvez para mudar as versões instaladas.Crie
/media-tools/docker/Dockerfile
e adicione as seguintes 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"]
Crie a imagem:
docker build -t media-tools ./docker
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 #
Durante a execução da imagem, é possível verificar as versões do FFmpeg e do Shaka Packager
para validar se tudo foi concluído com sucesso 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 próxima etapa é Noções básicas de streaming de mídia.