Nouveautés vidéo : transitions, chapitres, CMAF et plus encore
Ces derniers mois, nous avons ajouté plusieurs fonctionnalités vidéo, dont certaines à la demande de clients. Nous ne les avions jamais présentées par écrit. Les voici donc réunies, chacune avec des Assembly Instructions que nous avons exécutées en production avant publication.
Créer un fondu enchaîné entre des clips
🤖 /video/concat (English) assemble les vidéos bout à bout. Définissez
transition sur crossfade ou fade_to_black,
et les clips se fondent l’un dans l’autre au lieu de passer de l’un à l’autre par une coupe franche :
{
"steps": {
"first": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/big-buck-bunny-10s.mp4"
},
"second": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/waves10.mp4"
},
"concatenated": {
"robot": "/video/concat",
"use": {
"steps": [
{ "name": "first", "as": "video_1" },
{ "name": "second", "as": "video_2" }
]
},
"transition": "crossfade",
"transition_duration": 1,
"ffmpeg_stack": "v7"
}
}
}
Le son suit le fondu enchaîné de l’image. Voici des images extraites juste avant, pendant et juste après la transition :

Quelques points à connaître :
transition_durations’exprime en secondes et vaut1par défaut. Sa valeur est plafonnée à la moitié de la durée du clip le plus court de chaque paire.- Les clips se chevauchent pendant la transition, ce qui raccourcit le résultat : nos clips de
10 secondes et de 13 secondes ont produit une vidéo de 22 secondes. Cela vaut aussi pour
fade_to_black. - Une transition implique de réencoder la vidéo. Le traitement prend donc plus de temps qu’un simple assemblage, qui peut copier les flux tels quels.
- 🤖 /video/merge accepte les deux mêmes paramètres, mais
/video/concatest mieux adapté à l’assemblage de clips. Il gère les clips de tailles et de fréquences d’images différentes en les convertissant d’abord pour harmoniser leurs caractéristiques, et conserve votre sortie MP4.
Marqueurs de chapitre pour les vidéos assemblées
Lorsque vous assemblez une introduction, le contenu principal et une conclusion, définissez
chapter_markers: true. Les lecteurs qui prennent en charge les chapitres peuvent alors
accéder directement à chaque partie :
{
"steps": {
"intro": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/big-buck-bunny-10s.mp4"
},
"main": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/waves10.mp4"
},
"outro": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/fake-ad.mp4"
},
"concatenated": {
"robot": "/video/concat",
"use": {
"steps": [
{ "name": "intro", "as": "video_1" },
{ "name": "main", "as": "video_2" },
{ "name": "outro", "as": "video_3" }
]
},
"chapter_markers": true,
"transition": "crossfade",
"transition_duration": 1,
"ffmpeg_stack": "v7"
}
}
}
Chaque chapitre porte le nom de son fichier d’entrée, sans l’extension.
ffprobe les affiche dans le résultat :
$ ffprobe -v error -show_entries chapter=start_time,end_time:chapter_tags=title -of compact big-buck-bunny-10s_waves10_fake-ad.mp4
chapter|start_time=0.000000|end_time=9.000000|tag:title=big-buck-bunny-10s
chapter|start_time=9.000000|end_time=21.000000|tag:title=waves10
chapter|start_time=21.000000|end_time=26.000000|tag:title=fake-ad
Pour donner aux chapitres des titres lisibles, nommez vos fichiers d’entrée en conséquence. Les horodatages des chapitres tiennent compte du chevauchement lorsque vous ajoutez une transition. Chaque marqueur reste ainsi aligné sur son clip.
Sous-titres en gras, en italique et avec contour
🤖 /video/subtitle incruste les sous-titres dans l’image. Vous pouvez
maintenant les styliser avec bold, italic et
outline_width (0 à 10 pixels). Cette Assembly utilise un fichier
.srt téléversé et une vidéo importée :
{
"steps": {
":original": {
"robot": "/upload/handle"
},
"video": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/fake-ad.mp4"
},
"subtitled": {
"robot": "/video/subtitle",
"use": {
"steps": [
{ "name": "video", "as": "video" },
{ "name": ":original", "as": "subtitles" }
]
},
"subtitles_type": "burned",
"preset": "empty",
"font_size": 22,
"bold": true,
"outline_width": 4,
"ffmpeg_stack": "v7"
}
}
}
La moitié supérieure montre le style par défaut. La moitié inférieure montre
bold: true avec outline_width: 4, ce qui reste lisible sur un fond
clair :

Le style s’applique uniquement aux sous-titres incrustés, pas aux pistes de sous-titres.
"preset": "empty" conserve le format MP4 du fichier d’entrée. Sans préréglage, le Robot
utilise un ancien préréglage FLV.
Audio multilingue en HLS
Pour proposer une vidéo dans plusieurs langues, vous n’avez plus besoin d’une échelle de rendus
vidéo distincte par langue. 🤖 /video/adaptive avec
audio_group: true prépare les fichiers contenant uniquement de l’audio sous forme de
pistes audio alternatives, auxquelles chaque rendu vidéo fait référence. Les spectateurs peuvent
alors changer de langue dans le lecteur sans recharger la vidéo :
{
"steps": {
"video": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/big-buck-bunny-10s.mp4"
},
"audio_en": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/joakim_karud-rock_angel.mp3"
},
"audio_de": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/german-anthem.mp3"
},
"video_480p": {
"use": "video",
"robot": "/video/encode",
"preset": "hls/480p",
"ffmpeg_stack": "v7"
},
"video_720p": {
"use": "video",
"robot": "/video/encode",
"preset": "hls/720p",
"ffmpeg_stack": "v7"
},
"aac_en": {
"use": "audio_en",
"robot": "/audio/encode",
"preset": "aac",
"ffmpeg_stack": "v7",
"ffmpeg": {
"t": 10,
"metadata:s:a:0": "language=eng"
}
},
"aac_de": {
"use": "audio_de",
"robot": "/audio/encode",
"preset": "aac",
"ffmpeg_stack": "v7",
"ffmpeg": {
"t": 10,
"metadata:s:a:0": "language=deu"
}
},
"hls": {
"use": {
"steps": ["aac_en", "aac_de", "video_480p", "video_720p"],
"bundle_steps": true
},
"robot": "/video/adaptive",
"technique": "hls",
"audio_group": true
}
}
}
Nos fichiers de démonstration contiennent de la musique. Imaginez-les donc comme une bande-son en
anglais et une autre en allemand. t: 10 les raccourcit à la durée de la
vidéo. La langue de chaque piste provient de sa balise language, définie par
l’option metadata:s:a:0. Les fichiers qui possèdent déjà une balise de langue n’ont
pas besoin de cette option. La liste de lecture principale obtenue donne aux pistes des noms
lisibles, et le premier fichier audio dans use devient celui utilisé par
défaut. Si une piste possède une balise de titre, ce titre devient son nom. Sinon, le Robot utilise
le nom de la langue. AUTOSELECT=YES permet aux lecteurs de sélectionner une piste
correspondant à la langue du spectateur, et la valeur BANDWIDTH de chaque rendu
inclut son audio :
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_audio",NAME="English",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",CHANNELS="2",URI="128515_44100/128515_44100.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_audio",NAME="German",DEFAULT=NO,AUTOSELECT=YES,LANGUAGE="deu",CHANNELS="2",URI="128539_44100/128539_44100.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=797670,AVERAGE-BANDWIDTH=797670,RESOLUTION=852x480,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="group_audio",FRAME-RATE=25
852x480_616860_25/852x480_616860_25.m3u8
Avec audio_group, les rendus vidéo ne contiennent aucun audio propre. Fournissez
donc chaque langue dans un fichier audio distinct. Stockez les résultats avec
${file.meta.relative_path} dans le chemin, comme l’explique la documentation du Robot, pour que
les listes de lecture trouvent leurs segments.
CMAF : un seul ensemble de segments pour HLS et DASH
Les appareils Apple lisent le HLS, et de nombreux autres lecteurs préfèrent le MPEG-DASH. Avec
technique: "cmaf", /video/adaptive écrit une seule fois les segments MP4
fragmentés, ainsi qu’une liste de lecture HLS et un manifeste DASH qui y font tous deux référence.
Vous stockez et mettez en cache une seule copie de votre vidéo au lieu de deux :
{
"steps": {
"imported": {
"robot": "/http/import",
"url": "https://demos.transloadit.com/inputs/big-buck-bunny-10s.mp4"
},
"encoded_480p": {
"use": "imported",
"robot": "/video/encode",
"preset": "hls/480p",
"ffmpeg_stack": "v7"
},
"encoded_720p": {
"use": "imported",
"robot": "/video/encode",
"preset": "hls/720p",
"ffmpeg_stack": "v7"
},
"cmaf": {
"use": {
"steps": ["encoded_480p", "encoded_720p"],
"bundle_steps": true
},
"robot": "/video/adaptive",
"technique": "cmaf"
}
}
}
Le résultat contient playlist.m3u8 pour HLS, playlist.mpd pour
DASH et les segments .m4s qu’ils partagent. FFmpeg a décodé les deux
manifestes sans erreur lors de nos tests. hls_playlist_name et
playlist_name renomment les deux manifestes.
Les préréglages fournis hls/480p et hls/720p fonctionnent
ensemble dans une échelle de rendus CMAF, malgré la légère différence de rapport d’aspect due à
l’arrondi de la largeur du 480p à un nombre pair.
Nous en avons aussi profité pour que /video/adaptive applique désormais les options
ffmpeg que vous transmettez lors de la préparation des sorties HLS et CMAF,
comme hls_flags ou start_number. Auparavant, il les ignorait
sans le signaler.
Vidéos iPhone avec audio spatial
Les vidéos enregistrées avec l’audio spatial sur les iPhone récents contiennent deux pistes audio :
une piste AAC stéréo classique et une piste Apple Positional Audio que notre pile d’encodage ne
peut pas décoder. Jusqu’à récemment, cette seconde piste faisait échouer tout l’encodage.
/video/encode, 🤖 /audio/encode et
🤖 /speech/transcribe ignorent désormais les pistes audio qu’ils ne
peuvent pas décoder et utilisent la piste stéréo. Vous pouvez encoder la vidéo, en extraire l’audio
et transcrire un enregistrement iPhone téléversé dans une seule Assembly :
{
"steps": {
":original": {
"robot": "/upload/handle"
},
"video": {
"robot": "/video/encode",
"use": ":original",
"preset": "web/mp4/240p",
"ffmpeg_stack": "v7"
},
"audio": {
"robot": "/audio/encode",
"use": ":original",
"preset": "aac",
"ffmpeg_stack": "v7"
},
"transcript": {
"robot": "/speech/transcribe",
"use": ":original",
"provider": "aws",
"format": "text",
"source_language": "en-US"
}
}
}
L’audio spatial lui-même n’est pas conservé : le résultat encodé contient le mixage stéréo. Si la seule piste audio d’un fichier est une piste d’audio spatial, l’encodage audio et la transcription échouent toujours, car nous ne pouvons rien décoder.
Commencer
Toutes ces fonctionnalités sont disponibles avec n’importe quel forfait. Avec le forfait gratuit Community, les résultats audio et vidéo sont raccourcis. Une transition ou un chapitre situé plus loin peut donc se trouver en dehors du résultat d’un essai. La documentation des Robots 🤖 /video/concat (English), 🤖 /video/subtitle et 🤖 /video/adaptive répertorie tous les paramètres. Vous pouvez créer un compte gratuit pour les essayer.
