Converter vídeos para HLS, MPEG-Dash e CMAF
🤖/video/adaptive codifica vídeos em formatos compatíveis com HTTP Live Streaming (HLS), MPEG-Dash e CMAF e gera os arquivos de manifesto e playlist necessários.

Este Robot aceita todos os tipos de arquivos de vídeo e de áudio. Não se esqueça de usar o agrupamento de Step no seu parâmetro use para que o Robot processe vários arquivos de entrada de uma só vez.
Este Robot normalmente é usado em combinação com 🤖/video/encode. Implementamos predefinições de codificação de vídeo e áudio especificamente para oferecer suporte a MPEG-Dash e HTTP Live Streaming. Essas predefinições têm os prefixos "dash/" e "hls/". Veja uma demonstração de HTTP Live Streaming aqui (English).
Legendas em HLS
Com "technique": "hls", a primeira faixa de legendas incorporada de cada entrada é convertida em WebVTT segmentado e vinculada a partir da playlist master. As demais faixas de legendas da mesma entrada são descartadas. A Assembly adiciona um aviso quando alguma entrada contém mais de uma faixa de legendas.
Para adicionar uma faixa antes do empacotamento, use 🤖/video/subtitle com "subtitles_type": "external", "preset": "empty" e um language como "eng". Em seguida, codifique com uma predefinição "hls/" e passe o vídeo codificado para este Robot. Por padrão, o NAME das legendas na playlist usa o nome do idioma em inglês, por exemplo “English”; o LANGUAGE preserva a tag de idioma da entrada. Códigos de idioma não reconhecidos são usados como nome. Se o idioma estiver ausente ou for "und", o nome será “Unknown”. Mapeamentos personalizados de ffmpeg.var_stream_map controlam os próprios rótulos de legenda.
Para definir um nome de legenda explícito em um ffmpeg.var_stream_map personalizado, selecione "ffmpeg_stack": "v8.0.0" e use a opção sname correspondente.
As cues WebVTT e o vídeo MPEG-TS usam a mesma linha do tempo de timestamps. O priming de AAC ou a reordenação de quadros de vídeo podem deslocar ambos para depois do zero; portanto, um pequeno timestamp diferente de zero na primeira cue não significa, por si só, que as legendas estão atrasadas. Preserve os timestamps gerados para manter as legendas sincronizadas com o vídeo. Quando qualquer entrada de um Step HLS tem legendas, ffmpeg.muxdelay assume o padrão 0 para todo o Step, incluindo representações sem legendas. Substituir essa opção ou outras opções de timestamp pode alterar esse alinhamento.
Armazene os segmentos WebVTT e as playlists de legendas junto com todos os outros resultados, preservando ${file.meta.relative_path} conforme descrito abaixo.
Proporções de aspecto no CMAF
O CMAF alinha as proporções de aspecto de representações quase iguais, dentro de 1% da maior representação, sem recodificar nem alterar as dimensões em pixels. Isso permite que predefinições como "hls/480p" e "hls/720p" ofereçam suporte juntas à troca de bitrate.
Representações com proporções substancialmente diferentes, como 4:3 e 16:9, mantêm sua geometria em grupos de vídeo separados. A Assembly emite um aviso porque os players DASH não conseguem trocar de bitrate entre esses grupos. O HLS ainda lista todas as variantes. Use proporções de representação correspondentes quando opções personalizadas do FFmpeg alterarem a geometria ou o layout do vídeo.
Alinhamento de segmentos
Os segmentos de vídeo HLS e CMAF são divididos nos keyframes existentes, então sua duração real pode exceder segment_duration. Para alinhar as representações a segmentos de quatro segundos, defina "ffmpeg": { "force_key_frames": "expr:gte(t,n_forced*4)" } em cada Step 🤖/video/encode anterior. Substitua 4 pela duração de segmento escolhida e use o mesmo valor em todas as representações. Defina os intervalos de keyframe durante a codificação; o empacotamento não consegue adicionar keyframes a streams copiados.
Configurações de CORS necessárias para MPEG-Dash e HTTP Live Streaming
A reprodução de arquivos de manifesto MPEG-Dash ou de playlist HLS exige uma configuração adequada de CORS no lado do servidor. O servidor que disponibiliza os arquivos deve ser configurado para adicionar os seguintes campos de cabeçalho às respostas:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Allow-Headers: *
Se os arquivos estiverem armazenados em um bucket do Amazon S3, você poderá usar a seguinte definição de CORS para garantir que os campos de cabeçalho CORS sejam definidos corretamente:
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET"],
"AllowedOrigins": ["*"],
"ExposeHeaders": []
}
]
Para configurar o CORS no seu bucket do S3:
- Acesse https://s3.console.aws.amazon.com/s3/buckets/
- Clique no seu bucket
- Clique em “Permissions”
- Edite “Cross-origin resource sharing (CORS)”
Armazenamento de segmentos e arquivos de playlist
O Robot atribui aos arquivos de resultado (segmentos, segmentos de inicialização, arquivos de manifesto MPD e arquivos de playlist M3U8) a propriedade de metadados correta relative_path, para que você possa armazená-los facilmente usando um dos nossos Robots de armazenamento.
No parâmetro path do Robot de armazenamento de sua escolha, use a Assembly Variable ${file.meta.relative_path} para armazenar os arquivos nos caminhos adequados e fazer com que os arquivos de playlist funcionem.
Exemplo de uso
Implementação de HTTP Live Streaming: codifique o vídeo carregado em três versões, depois divida-as em vários segmentos e gere arquivos de playlist contendo todos os segmentos:
{
"steps": {
":original": {
"robot": "/upload/handle"
},
"encoded_1080p": {
"ffmpeg_stack": "v7",
"preset": "hls/1080p",
"robot": "/video/encode",
"use": ":original"
},
"encoded_480p": {
"ffmpeg_stack": "v7",
"preset": "hls/480p",
"robot": "/video/encode",
"use": ":original"
},
"encoded_720p": {
"ffmpeg_stack": "v7",
"preset": "hls/720p",
"robot": "/video/encode",
"use": ":original"
},
"hls_bundled": {
"playlist_name": "my_playlist.m3u8",
"robot": "/video/adaptive",
"technique": "hls",
"use": {
"bundle_steps": true,
"steps": [
"encoded_480p",
"encoded_720p",
"encoded_1080p"
]
}
}
}
}Parâmetros
interpolateboolean | Record<string, boolean>Controla se as Assembly Variables são interpoladas em campos individuais de instruções.
Por padrão, a maioria dos campos de instruções dos Robots interpola Assembly Variables. Defina isso como
falsepara tratar todos os campos de instruções como texto literal, ou defina o caminho de um campo individual comofalsepara tratar apenas esse campo como texto literal. Para campos específicos de um Robot que são literais por padrão, defina isso comotrueou defina o caminho desse campo comotruepara voltar a usar a interpolação.Use nomes de campos como
pathou caminhos com pontos comoffmpeg.vfpara objetos aninhados.output_metaRecord<string, boolean> | boolean | Array<string>Permite especificar um conjunto de metadados cujo cálculo é mais custoso para a CPU e que, por isso, vem desativado por padrão para manter o processamento das suas Assemblies rápido.
Para imagens, você pode adicionar
"has_transparency": trueneste objeto para extrair se a imagem contém partes transparentes e"dominant_colors": truepara extrair um array de códigos de cores hexadecimais da imagem.Para imagens, você também pode adicionar
"blurhash": truepara extrair uma string BlurHash, uma representação compacta de um placeholder da imagem, útil para exibir uma prévia desfocada enquanto a imagem completa carrega.Para imagens,
"thumbhash": trueem vez disso extrai um ThumbHash codificado em base64 emmeta.thumbhash, junto commeta.has_alpha(se existe um canal alfa, mesmo quando totalmente opaco). Ele descreve pixels orientados por EXIF e usa o primeiro quadro de imagens animadas. A extração é feita em regime de melhor esforço: imagens acima de 40 megapixels, formatos não suportados ou uma decodificação com falha/limitada não geram placeholder. Uma extração bem-sucedida adiciona uma cobrança de metadados equivalente a 20% dos bytes desse arquivo. Nenhuma sobretaxa de ThumbHash se aplica quando desativado ou quando nenhum hash é gerado.Defina essa opção no Step que produz a imagem, como
/upload/handlepara originais enviados por upload ou/image/resizepara saídas processadas. Defini-la apenas em/transloadit/storenão solicita a extração: o armazenamento preserva os metadados do produtor. O Transloadit Storage persiste um hash gerado com sua versão imutável e o retorna em resultados armazenados e em leituras nativas de ativos. Uploads diretos para o S3 não geram placeholders. Um placeholder contém informações da imagem, portanto proteja-o com os mesmos controles de acesso da imagem completa.Para vídeos, você pode adicionar o parâmetro
"colorspace": truepara extrair o espaço de cores do vídeo de saída.Para vídeos, você também pode adicionar
"interlaced": truepara detectar se o vídeo é entrelaçado. Isso combina a flag barata do ffprobefield_ordercom uma passagem de amostragemidetlimitada sobre os primeiros quadros da origem, expondointerlaced,field_ordere um objeto de diagnósticointerlace_detectionemfile.meta. Isso é computacionalmente caro e cobrado de acordo.Para áudio, você pode adicionar
"mean_volume": truepara obter um único valor que representa o volume médio do arquivo de áudio.Você também pode definir isso como
falsepara pular a extração de metadados e acelerar a transcodificação.user_metaRecord<string, any>(padrão:{})Adiciona metadados JSON personalizados a cada arquivo emitido sem modificar seu conteúdo. Objetos e arrays aninhados são suportados.
A herança depende do Robot. Os valores são mesclados com o
user_metaexistente no arquivo de saída; o Step atual substitui as chaves de nível superior com o mesmo nome. Atribua explicitamente as chaves necessárias quando um Robot criar novas saídas.Nos Steps de processamento,
${file.*}se refere à primeira entrada e${result.*}ao arquivo emitido. Os valores são avaliados para cada saída após a execução do Robot, antes da extração subsequente de metadados e do armazenamento temporário. Em:original, os valores são avaliados para cada upload antes da extração de metadados.Os Steps subsequentes leem
${file.user_meta.key}. Consulte Metadados personalizados para ver um exemplo completo e as regras de herança.resultboolean(padrão:false)Se os resultados deste Step devem estar presentes no Assembly Status JSON
queuebatchDefinir a fila como “batch” rebaixa manualmente a prioridade dos Jobs deste Step, para evitar o consumo de vagas prioritárias de Jobs em Jobs que não precisam de tempo zero de espera na fila
force_acceptboolean(padrão:false)Forçar um Robot a aceitar um tipo de arquivo que ele teria ignorado.
Por padrão, os Robots ignoram arquivos que não conhecem. O 🤖/video/encode, por exemplo, ignora tranquilamente imagens de entrada.
Com o parâmetro
force_acceptdefinido comotrue, você pode forçar os Robots a aceitar todos os arquivos enviados a eles. Isso normalmente leva a erros e só deve ser usado para depuração ou para lidar com casos extremos.ignore_errorsboolean | Array<meta | execute>(padrão:[])Ignorar erros durante fases específicas do processamento.
Definir isso como
["meta"]fará com que o Robot ignore erros durante a extração de metadados.Definir isso como
["execute"]fará com que o Robot ignore erros durante a fase principal de execução.Definir isso como
trueequivale a["meta", "execute"]e fará com que erros sejam ignorados nas duas fases.usestring | Array<string> | Array<object> | objectEspecifica quais Steps usar como entrada.
- Você pode escolher qualquer nome para os Steps, exceto
":original"(reservado para uploads de usuários tratados pela Transloadit) - Você pode fornecer vários Steps como entrada usando arrays:
{ "use": [ ":original", "encoded", "resized" ] } - Você também pode marcar os Steps de entrada com
aspara transmitir intenção semântica aos Robots:{ "use": [ { "name": ":original", "as": "image" }, { "name": ":original", "as": "mask" } ] }
DicaProvavelmente é tudo o que você precisa saber sobre
use, mas você pode ver os casos de uso avançados.- Você pode escolher qualquer nome para os Steps, exceto
ffmpegobjectOpções personalizadas do FFmpeg são compatíveis com as técnicas
"hls"e"cmaf". Opções personalizadas não vazias são rejeitadas para"dash", a técnica padrão.Essas opções se aplicam ao comando de empacotamento, que copia os streams de entrada por padrão. Defina as opções de codificação, como intervalos de keyframe, no Step 🤖/video/encode anterior.
ffmpeg_stackv6 | v7 | v8 | string(padrão:"v7.0.0")Seleciona o stack do FFmpeg para o empacotamento. O padrão é
"v7.0.0". Este Robot sempre usa pelo menos"v7.0.0"; seleções de stack mais antigas são atualizadas automaticamente.widthstring | number | nullEste parâmetro não tem efeito neste Robot. Defina a largura da representação no Step 🤖/video/encode anterior.
heightstring | number | nullEste parâmetro não tem efeito neste Robot. Defina a altura da representação no Step 🤖/video/encode anterior.
presetandroid | android-high | android-low | android_high | android_low | dash-1080p-video | dash-1080p_video |Este parâmetro não tem efeito neste Robot. Defina a predefinição de codificação no Step 🤖/video/encode anterior.
techniquedash | hls | cmaf(padrão:"dash")Determina qual técnica de streaming deve ser usada. Oferece suporte a
"dash"para MPEG-Dash,"hls"para HTTP Live Streaming e"cmaf"para saída CMAF baseada em FFmpeg com manifestos MPEG-Dash e HLS que fazem referência aos mesmos segmentos fMP4.playlist_namestringO nome do arquivo de manifesto/playlist gerado. O padrão é
"playlist.mpd"setechniquefor"dash", e"playlist.m3u8"setechniquefor"hls". Para"cmaf", este valor define o nome do manifesto MPEG-Dash e tem como padrão"playlist.mpd".hls_playlist_namestringUsado apenas quando
techniqueé"cmaf". Define o nome do arquivo da playlist mestre HLS gerada. O padrão é"playlist.m3u8".segment_durationstring | numberA duração de cada segmento, em segundos. Quando omitido, o padrão é 4 segundos para MPEG-Dash e CMAF, e 10 segundos para HLS.
closed_captionsboolean(padrão:true)Determina se você quer suporte a legendas ocultas ao usar a técnica
"hls".audio_groupboolean(padrão:false)Quando definido como
truee usado com a técnica"hls", os arquivos de entrada somente de áudio são tratados como versões de áudio alternativas em vez de variantes de stream independentes. Isso permite que os players ofereçam seleção de faixa de áudio (por exemplo, para vários idiomas). Os arquivos somente de áudio são listados como entradas#EXT-X-MEDIA:TYPE=AUDIOna playlist multivariante, e as variantes de vídeo fazem referência a eles pelo atributoAUDIO.Quando esta opção está ativada, as entradas de vídeo incluem apenas seu stream de vídeo nos segmentos de saída (qualquer áudio multiplexado é excluído). Forneça o áudio separadamente como arquivos de entrada somente de áudio.
O
LANGUAGEde cada versão vem da taglanguagedo primeiro stream de áudio em seu arquivo de entrada somente de áudio, ou é"und"quando a tag está ausente. Defina a tag em 🤖/audio/encode com"ffmpeg": {"metadata:s:a:0": "language=deu"}, por exemplo.O primeiro arquivo de entrada somente de áudio na ordem de
use.stepstorna-seDEFAULT=YES; as demais versões têmDEFAULT=NO. Todas as versões de áudio têmAUTOSELECT=YES. ONAMEdelas usa a tagtitledo stream de áudio quando presente; caso contrário, usa o nome do idioma em inglês (por exemplo,"eng"torna-se “English” e"deu"torna-se “German”). O áudio sem tag recebe o nome “Unknown”; códigos de idioma não reconhecidos são usados como nome. Nomes duplicados recebem um sufixo numérico.Esta opção só habilita versões de áudio alternativas com a técnica
"hls"e não altera o empacotamento com"dash"ou"cmaf". O CMAF coloca todo o áudio em um único conjunto de adaptação rotulado com o primeiro idioma de áudio. Definiraudio_group: truecom CMAF, ou fornecer entradas CMAF com mais de um idioma de áudio conhecido (incluindo faixas multiplexadas em um único vídeo), adiciona um aviso à Assembly; o empacotamento continua com a saída CMAF existente. Para áudio em vários idiomas, usetechnique: "hls"comaudio_group: true.
Demonstrações
Publicações relacionadas no blog
- Apresentamos o suporte a MPEG-DASH para streaming adaptativo
- Novo modelo de preços para futuros clientes da Transloadit
- Guia de codificação de vídeos para streaming com a Transloadit
- What is HLS? (English)
- Save costs with on-demand video encoding (English)
- Novidades em vídeo: transições, capítulos, CMAF e mais