Neste artigo, aprenderemos alguns comandos comuns para converter e manipular características específicas de arquivos de mídia. Tentamos mostrar operações equivalentes para todos os procedimentos, mas nem todas são possíveis em ambos os aplicativos.
Em muitos casos, os comandos que estamos mostrando podem ser combinados em uma única operação de linha de comando e seriam quando realmente usados. Por exemplo, nada impede você de definir a taxa de bits de um arquivo de saída na mesma operação que uma conversão de arquivo. Para fins de esclarecimento, muitas vezes mostramos essas operações como comandos separados neste artigo.
A conversão é feita com estes aplicativos:
Características de exibição
Tanto o Shaka Packager quanto o FFmpeg podem ser usados para inspecionar o conteúdo de um arquivo de mídia e, em seguida, exibir as características de um stream. No entanto, ambos fornecem saídas diferentes para a mesma mídia.
Características usando o Shaka Packager
packager input=glocken.mp4 --dump_stream_info
A saída é semelhante a esta:
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 usando o FFmpeg
ffmpeg -i glocken.mp4
A saída é semelhante a esta:
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 (separar) os streams de áudio e vídeo
O Shaka Packager exige o demuxing ao converter arquivos. Isso também é necessário para usar frameworks de mídia.
Desmuxing da Shaka Packager
MP4
packager input=myvideo.mp4,stream=video,output=myvideo_video.mp4
packager input=myvideo.mp4,stream=audio,output=myvideo_audio.m4a
ou:
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
Desmuxing do 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 (combinar) os streams de áudio e vídeo
Em algumas situações, você precisará combinar o áudio e o vídeo em um único contêiner. Especialmente quando não está usando um framework de mídia. Isso é algo que o FFmpeg pode lidar muito bem e é algo que o Shaka Packager não aceita atualmente.
ffmpeg -i myvideo_video.webm -i myvideo_audio.webm -c copy myvideo.webm
Características da mudança
Taxa de bits
Para o FFmpeg, podemos fazer isso durante a conversão para .mp4
ou .webm
.
ffmpeg -i myvideo.mov -b:v 350K myvideo.mp4
ffmpeg -i myvideo.mov -vf setsar=1:1 -b:v 350K myvideo.webm
Dimensões (resolução)
ffmpeg -i myvideo.webm -s 1920x1080 myvideo_1920x1080.webm
Tipo de arquivo
O Shaka Packager não pode processar arquivos .mov
e, portanto, não pode ser usado para converter
arquivos desse formato.
.mov
a .mp4
ffmpeg -i myvideo.mov myvideo.mp4
.mov
a .webm
ffmpeg -i myvideo.mov myvideo.webm
Sincronizar áudio e vídeo
Para garantir que o áudio e o vídeo sejam sincronizados durante a reprodução, insira frames-chave.
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
Áudio para 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
Áudio para um 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
Vídeo sob demanda e transmissão ao vivo
Vamos demonstrar dois tipos de protocolos de streaming neste artigo. O primeiro é o Dynamic Adaptive Streaming over HTTP (DASH), uma técnica de streaming de taxa de bits adaptável e um método baseado em padrões da Web de apresentação de vídeo sob demanda. O segundo é o HTTP Live Streaming (HLS), que é o padrão da Apple para transmissão ao vivo e vídeo sob demanda na Web.
DASH/MPD
Este exemplo gera o arquivo de saída de descrição de apresentação de mídia (MPD, na sigla em inglês) com base nos streams de áudio e vídeo.
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
Esses exemplos geram um arquivo de saída M3U8
dos streams de áudio e vídeo,
que é uma playlist multimídia codificada em 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
OU:
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"
Agora que sabemos como converter arquivos, podemos aproveitar o que aprendemos neste artigo e saber mais sobre Criptografia de mídia a seguir.