Points clés à retenir
- Proposez des commandes, sauf si un lecteur spécialement conçu assure un comportement équivalent au clavier et avec les technologies d’assistance.
- Utilisez playsinline pour que les iPhone lisent la vidéo dans la page sans imposer le plein écran, et considérez la lecture automatique comme une amélioration facultative qui nécessite normalement de couper le son.
- Déclarez le type MIME réel de chaque source pour que le navigateur puisse écarter les sources candidates non prises en charge sans les télécharger.
Afficher un élément vidéo est facile, mais il est étonnamment facile de mal l’intégrer en production. Une lecture fiable exige une cohérence entre le fichier encodé, le balisage, la politique du navigateur, les conditions réseau et les alternatives accessibles.
L’essentiel
- Incluez width et height ou un conteneur avec aspect-ratio pour éviter les décalages de mise en page avant l’arrivée des métadonnées.
- Choisissez preload="metadata" ou preload="none" pour les pages de liste au lieu de télécharger silencieusement chaque vidéo.
- Générez une image d’affiche représentative plutôt que d’afficher une image vide ou ce qui se trouve à l’instant zéro de la vidéo.
- Ajoutez des sous-titres d’accessibilité avec un élément track et proposez une transcription lorsque le contenu parlé a un intérêt en dehors de la lecture.
- Conservez le fichier original hors du chemin d’accès public destiné à la lecture ; publiez plutôt des rendus contrôlés.
- Mesurez le délai de démarrage, les remises en mémoire tampon, les octets transférés et le coût du décodage sur des téléphones et des réseaux courants.
- Gérez les erreurs de chargement et de décodage en affichant un message de remplacement utile plutôt qu’un rectangle figé.
Commencer par définir les exigences de lecture
L’élément vidéo est une interface de lecture dans le navigateur, pas une stratégie complète de diffusion. Avant d’écrire le balisage, définissez les navigateurs pris en charge, les catégories d’appareils, les conditions réseau, la durée prévue des vidéos et les exigences d’accessibilité. Ces contraintes déterminent les rendus, les commandes, les sous-titres d’accessibilité, les images d’affiche et les solutions de repli nécessaires à la page.
Séparez les responsabilités dès le départ. Le traitement multimédia prépare des fichiers compatibles, tandis que HTML, CSS et JavaScript régissent la présentation et les interactions. Transloadit peut encoder la vidéo, extraire des miniatures et produire des transcriptions, mais l’application exécutée dans le navigateur reste responsable des commandes de lecture, du comportement au clavier, de la politique de lecture automatique, de la mise en page adaptative et des alternatives accessibles.
Définir les critères de réussite
Précisez le délai de démarrage acceptable, la qualité visuelle, le volume de données à transférer, la couverture des sous-titres d’accessibilité et le comportement en cas d’échec avant de choisir les formats.
Conserver un fichier maître source
Conservez l’original dans un stockage protégé pour de futurs retraitements, mais publiez des rendus contrôlés pour la lecture.
Choisir les conteneurs, les codecs et les sources de manière réfléchie
Un nom de fichier se terminant par .mp4 identifie un conteneur, sans décrire tout son contenu. Le navigateur doit prendre en charge le conteneur, le codec vidéo, le codec audio, le profil, le niveau, les dimensions et les autres caractéristiques des flux. Un rendu MP4 aux paramètres prudents utilise généralement la vidéo H.264 et l’audio AAC, mais la compatibilité doit tout de même être testée sur les combinaisons réelles de navigateurs et d’appareils ciblées.
Si vous proposez plusieurs éléments source, classez-les du format privilégié à la solution de repli la plus largement compatible, par exemple un rendu WebM avant le rendu MP4 de base, et déclarez le type MIME réel de chaque source candidate. Les navigateurs examinent les sources dans l’ordre du document et sélectionnent normalement la première qu’ils estiment pouvoir lire. Ils ne téléchargent pas toutes les sources candidates pour comparer leur qualité visuelle. Un type inexact peut entraîner des requêtes inutiles, un échec de sélection ou des diagnostics difficiles à interpréter.
Inspecter les fichiers publiés
Vérifiez le conteneur, les flux, les codecs, les dimensions, la durée et la présence d’audio plutôt que de vous fier à l’extension du fichier d’entrée.
Éviter les variantes redondantes
Chaque rendu ajoute des coûts d’encodage, de stockage, de validation et de cache ; créez donc des variantes qui répondent à un besoin défini de compatibilité ou de qualité.
Fournir des commandes utilisables et encadrer prudemment la lecture automatique
Utilisez l’attribut natif controls, sauf si un lecteur personnalisé offre des fonctionnalités équivalentes. Un lecteur de remplacement doit proposer la lecture et la pause, la navigation dans la vidéo, le réglage du volume, la coupure du son, les sous-titres d’accessibilité, le fonctionnement en plein écran, un focus visible, des noms accessibles et un fonctionnement prévisible au clavier. Testez-le uniquement au clavier, puis avec la sortie d’un lecteur d’écran. Une icône de lecture stylisée ne remplace pas correctement une interface de commande complète.
Considérez la lecture automatique comme une amélioration facultative. Les navigateurs bloquent couramment la lecture automatique avec du son, et les paramètres utilisateur peuvent imposer des règles plus strictes. Si une vidéo d’ambiance silencieuse contribue réellement à la conception, combinez autoplay avec muted et playsinline, puis gérez le rejet de la promesse play. Ne rendez jamais des informations indispensables accessibles uniquement par la lecture automatique, et respectez les préférences de réduction des animations en évitant les mouvements automatiques lorsque cela convient.
<video
controls
playsinline
preload="metadata"
poster="/media/demo-poster.webp"
width="1280"
height="720"
>
<source src="/media/demo.webm" type="video/webm" />
<source src="/media/demo.mp4" type="video/mp4" />
<track
default
kind="captions"
label="English"
src="/media/demo.en.vtt"
srclang="en"
/>
<p><a href="/media/demo.mp4">Download the video</a>.</p>
</video>Garder les commandes repérables
Ne faites pas apparaître les commandes de lecture essentielles uniquement au survol, car les personnes utilisant un écran tactile, un clavier ou des technologies d’assistance risquent de ne jamais déclencher cet état.
Permettre de reprendre après un échec
Si la lecture automatique est refusée, laissez une commande de lecture clairement identifiable au lieu de présenter une image d’affiche inerte.
Maîtriser la mise en page, le chargement et l’adaptation aux écrans
Définissez des attributs width et height qui reflètent le rapport d’aspect de la variante, ou réservez de l’espace avec un conteneur CSS utilisant aspect-ratio. Une image d’affiche seule ne permet pas de définir de manière fiable les dimensions occupées par la vidéo dans la mise en page. Réserver de l’espace empêche le texte et les commandes environnants de se déplacer à l’arrivée des métadonnées. Utilisez des règles max-width pour que l’élément puisse rétrécir sans déborder des écrans étroits.
Choisissez preload selon le contexte de la page. preload="metadata" peut aider une page de détail à déterminer la durée et les dimensions sans demander le fichier entier, tandis que preload="none" convient souvent mieux aux listes contenant de nombreuses vidéos. Cet attribut n’est qu’une indication. Les navigateurs peuvent modifier leur comportement en raison des préférences d’économie de données, de la pression sur la mémoire, des règles de lecture automatique ou de détails d’implémentation. Mesurez donc les requêtes réelles au lieu de supposer que cette indication sera respectée.
Définir un budget pour les pages de liste
Dix petites requêtes de métadonnées peuvent tout de même entraîner des coûts évitables de connexion, de transfert et de serveur.
Tester les changements d’orientation
Vérifiez les mises en page en portrait et en paysage après une rotation de la zone d’affichage, y compris les sous-titres d’accessibilité et l’emplacement des commandes.
Sélectionner des images d’affiche, des sous-titres d’accessibilité et des transcriptions utiles
Une image d’affiche doit représenter la vidéo, rester reconnaissable à sa taille de rendu et éviter d’exposer une image privée ou embarrassante. L’image à l’instant zéro est souvent noire, floue ou dominée par une transition. Générez plusieurs images candidates et examinez le résultat sélectionné. Le Robot /video/thumbs peut extraire des images à intervalles réguliers ou à des positions temporelles précises, après quoi l’application doit choisir une image d’affiche appropriée.
Les sous-titres d’accessibilité utilisent normalement WebVTT avec un élément track. Ils doivent inclure les paroles ainsi que les sons significatifs et les changements de locuteur lorsque ces détails influent sur la compréhension. Une transcription permet de rechercher les informations et de les utiliser en dehors de la lecture. Le Robot /speech/transcribe peut produire des sorties WebVTT, SRT, textuelles ou structurées, mais le texte généré automatiquement nécessite toujours une révision éditoriale portant sur les noms, les termes techniques, la synchronisation et les contenus sensibles.
Distinguer les sous-titres d’accessibilité des sous-titres
Les sous-titres traduisent ou transcrivent principalement les dialogues, tandis que les sous-titres d’accessibilité restituent aussi les éléments sonores pertinents autres que la parole.
Privilégier les pistes activables et désactivables
Les pistes externes préservent le contrôle de l’utilisateur et les possibilités de mise en forme ; le texte incrusté ne convient que lorsque chaque spectateur doit voir le même texte.
Construire un flux de traitement reproductible
Pour les téléversements en production, utilisez une recette de traitement enregistrée plutôt que d’accepter des instructions d’encodage arbitraires provenant du navigateur. Un Template Transloadit peut relier la gestion des téléversements à /video/encode, à /video/thumbs et à des étapes de transcription, de sous-titrage et de stockage selon les besoins. Désactivez la redéfinition des Steps lorsque le client ne doit pas modifier la recette, et utilisez des requêtes signées lorsque des clients non fiables peuvent lancer des traitements. Pour l’exemple d’image d’affiche ci-dessous, utilisez un bucket S3 privé avec Block Public Access activé et le paramètre Object Ownership défini sur Bucket owner enforced (ACL désactivées). Définissez acl sur bucket-default et n’ajoutez aucun en-tête ACL ou grant dans headers. Les politiques du bucket et les politiques IAM, et non ce seul paramètre, contrôlent la confidentialité.
Uppy peut fournir l’interface de téléversement dans le navigateur et créer des Assemblies Transloadit pendant le transfert et le traitement des fichiers. La progression du téléversement et celle du traitement sont des états différents ; attribuez-leur donc des libellés distincts. Un fichier peut être entièrement téléversé alors que son encodage est encore en cours. Si la progression exacte du traitement n’est pas disponible, affichez un état indéterminé fidèle à la réalité plutôt que d’inventer un pourcentage.
Pour l’exemple ci-dessous, créez un ensemble d’informations d’identification de Template pour S3 nommé poster-output avec un accès en écriture à un préfixe de test privé, enregistrez le Template et exigez Signature Authentication. Les limites de 100 MiB et d’un seul fichier constituent une politique donnée à titre d’exemple, et non des limites de forfait. Installez @transloadit/node, définissez les trois variables d’environnement dans le processus serveur, enregistrez le code TypeScript sous poster.ts et exécutez node poster.ts ./video.mp4 avec Node.js 24. L’Auth Secret reste sur le serveur. Ce Template exporte uniquement l’image d’affiche ; conservez la vidéo source séparément si votre produit en a besoin.
Le Step standard /video/thumbs demande une image à 25 % de la durée de la source. Il s’agit d’un choix de position temporelle, et non d’une garantie d’obtenir une bonne image d’affiche ou un positionnement précis à l’image près pour chaque entrée. Vérifiez les dimensions et les métadonnées renvoyées, confirmez l’existence de l’objet S3 privé et examinez-le avant de le rendre accessible via votre couche de diffusion. Les positions temporelles hors limites sont ignorées ; une Assembly sans l’image d’affiche requise ne constitue pas un résultat réussi pour l’application. Consultez la démo existante de vidéo et de S3 (English) pour voir sa vidéo enregistrée utilisée en entrée et les huit images extraites. Il s’agit de sorties historiques issues du Template différent utilisé par cette démo, et non d’une nouvelle exécution de cet exemple produisant une image d’affiche.
Pour utiliser plutôt la sélection par IA, supprimez offsets et définissez smart: true, count: 1 et smart_max_candidates: 3 sur le Step de l’image d’affiche. Le mode intelligent génère ses propres horodatages candidats ; il ne sélectionne pas les images à partir de vos positions temporelles explicites. Son nombre de candidats est max(count, min(smart_max_candidates, 3 * count)), le réglage du nombre de candidats ne constitue donc pas un plafond strict en dessous de count. Les images sélectionnées sont renvoyées dans l’ordre chronologique, sans classement plaçant la meilleure en premier. La documentation de référence du Robot (English) décrit les paramètres actuels et les frais distincts d’analyse par IA qui s’ajoutent au traitement habituel des miniatures.
L’évaluation par IA peut échouer et se rabattre sur l’ordre chronologique des candidats ; examinez meta.smart_reasons ainsi que meta.smart_score et meta.thumb_offset. Si aucun candidat n’est extrait, l’implémentation tente une extraction standard. Ni ce mécanisme de repli ni une évaluation réussie ne remplacent la modération ou l’approbation éditoriale. Prévoyez une solution de repli explicite dans l’application, par exemple un visuel de remplacement validé, et ne publiez aucun résultat manquant, privé ou inapproprié. Lors d’une nouvelle tentative, tenez compte de l’enregistrement de l’Assembly existante afin qu’une réponse ambiguë ne crée pas de traitements en double.
{
"allow_steps_override": false,
"auth": { "max_size": 104857600, "max_number_of_files": 1 },
"steps": {
":original": { "robot": "/upload/handle" },
"video": {
"robot": "/file/filter",
"use": ":original",
"accepts": [["${file.mime}", "regex", "^video/"]],
"error_on_decline": true
},
"poster": {
"robot": "/video/thumbs",
"use": "video",
"ffmpeg_stack": "v7",
"offsets": ["25%"],
"smart": false,
"width": 640,
"height": 360,
"resize_strategy": "fit",
"format": "jpeg",
"result": true
},
"exported": {
"robot": "/s3/store",
"use": "poster",
"credentials": "poster-output",
"acl": "bucket-default",
"path": "posters/${assembly.id}/${file.url_name}"
}
}
}import { Transloadit } from '@transloadit/node'
async function main(): Promise<void> {
const authKey = process.env.TRANSLOADIT_KEY
const authSecret = process.env.TRANSLOADIT_SECRET
const templateId = process.env.TRANSLOADIT_POSTER_TEMPLATE_ID
const inputPath = process.argv[2]
if (!authKey || !authSecret || !templateId || !inputPath) {
throw new Error('Set the credentials and Template ID, then pass a video path.')
}
const client = new Transloadit({ authKey, authSecret })
const assembly = await client.createAssembly({
files: { video: inputPath },
params: { template_id: templateId },
waitForCompletion: true,
})
if (assembly.ok !== 'ASSEMBLY_COMPLETED' || assembly.results?.poster?.length !== 1) {
throw new Error('The expected poster workflow did not complete.')
}
// Save the Assembly ID with the application asset; export is private, not publication.
console.log('Poster ready for review. Assembly:', assembly.assembly_id)
}
main().catch(() => {
console.error('Could not prepare the poster. Check the Assembly in your workspace.')
process.exitCode = 1
})Publier uniquement les résultats validés
Vérifiez que la variante de diffusion, l’image d’affiche, les sous-titres d’accessibilité et les résultats stockés attendus existent avant de rendre public un enregistrement de contenu.
Utiliser un stockage durable
Exportez les résultats finaux vers un stockage contrôlé au lieu de considérer les URL temporaires de traitement comme des adresses de diffusion permanentes.
Gérer les erreurs et la diffusion entre origines en toute sécurité
Détectez les erreurs de chargement et de lecture des médias et proposez une solution de repli utile à proximité du lecteur. Expliquez que la vidéo n’a pas pu être chargée, proposez une nouvelle tentative lorsque cela convient et fournissez un lien vers une transcription ou un téléchargement de remplacement lorsque la politique le permet. Consignez suffisamment de contexte pour distinguer un objet manquant, une requête bloquée, un codec non pris en charge, un flux corrompu et un échec de décodage, sans exposer d’informations d’identification ni d’URL privées.
Les fichiers de sous-titres d’accessibilité provenant d’une autre origine ne se chargent que si l’élément média définit un attribut crossorigin et si la réponse de la piste inclut les en-têtes CORS correspondants. Les fichiers vidéo et les images d’affiche provenant d’une autre origine nécessitent surtout CORS lorsque JavaScript dessine des images dans un canvas ou lit leurs données. Utilisez HTTPS de bout en bout, limitez les types et les tailles des téléversements aux frontières de confiance, effectuez une analyse de sécurité ou une validation des fichiers clients selon le modèle de menace et ne placez jamais de secrets d’API dans le code du navigateur. Traitez les métadonnées et les noms de fichiers comme des entrées non fiables.
Tester les cas d’échec
Testez les cas suivants : image d’affiche manquante, fichier de sous-titres d’accessibilité mal formé, requête de plage rejetée, autorisation expirée et source non prise en charge.
Protéger les originaux
Appliquez des contrôles d’accès et des règles de conservation indépendamment aux fichiers sources, aux fichiers de lecture dérivés et aux transcriptions.
Mesurer la qualité de lecture et le coût d’exploitation
Testez sur des téléphones courants et des réseaux limités, pas seulement sur un ordinateur de développement rapide. Mesurez le temps de démarrage, les remises en mémoire tampon, les octets transférés, la variante de diffusion sélectionnée, les erreurs de décodage et l’abandon de la lecture. Limitez le débit des connexions, activez les paramètres d’économie de données et testez des pages longues comportant plusieurs lecteurs. Une vidéo qui démarre rapidement lorsqu’elle est seule peut offrir de mauvaises performances lorsqu’elle partage les ressources avec des images, des outils d’analyse d’audience et le code de l’application.
L’encodage, la transcription, l’analyse des miniatures, le stockage et la diffusion contribuent chacun au coût. Évitez de générer des formats inutilisés ou des dizaines d’images d’affiche presque identiques. Surveillez les échecs des Assemblies, la latence de traitement, la taille des résultats et la croissance du stockage. Conservez un fichier de test dont le bon fonctionnement est avéré pour chaque catégorie d’entrée prise en charge, et traitez-le à nouveau lorsque vous modifiez un Template, un préréglage de codec, un lecteur ou une configuration de diffusion.
Versionner les modifications de traitement
Déployez les nouvelles configurations de traitement sur un échantillon de contenu et conservez la possibilité de comparer ou de restaurer les résultats précédents.
Configurer des alertes opérationnelles
Déclenchez des alertes en cas de taux d’échec durablement élevés, de résultats manquants, d’accumulation de traitements en attente et d’augmentations inattendues des transferts ou du stockage.
Détails techniques à connaître
- Un conteneur tel que MP4 ne garantit pas la lecture : les navigateurs doivent également prendre en charge les codecs vidéo et audio qu’il contient, généralement H.264 pour la vidéo et AAC pour l’audio.
- L’attribut preload est une indication destinée au navigateur plutôt qu’une commande. Les navigateurs peuvent l’ignorer en raison des paramètres d’économie de données, de la politique de lecture automatique, de la pression sur la mémoire ou de choix d’implémentation.
- Les pistes HTML de sous-titres d’accessibilité utilisent normalement WebVTT. Les sous-titres d’accessibilité devraient identifier les sons et les locuteurs pertinents, tandis qu’une transcription peut rendre ces mêmes informations consultables par recherche et utilisables en dehors de la lecture.
- Les navigateurs évaluent les éléments source dans l’ordre du document et sélectionnent le premier candidat qu’ils estiment pouvoir lire ; ils ne comparent pas toutes les sources pour choisir celle qui offre la meilleure qualité visuelle.
- Une image d’affiche ne définit pas le rapport d’aspect intrinsèque de la vidéo dans toutes les mises en page ; des valeurs explicites pour width et height ou la propriété CSS aspect-ratio permettent donc toujours d’éviter les décalages de mise en page.
- Les fichiers de sous-titres d’accessibilité provenant d’une autre origine ne se chargent que si l’élément média possède un attribut crossorigin et si la réponse de la piste inclut les en-têtes CORS correspondants ; les images d’affiche et les sources vidéo nécessitent surtout CORS lorsque JavaScript lit des pistes ou qu’un canvas capture des images vidéo.
Une approche pratique
- 1
Définissez les navigateurs, les appareils, le niveau d’accessibilité et les conditions réseau attendues avant de choisir les fichiers de sortie.
- 2
Encodez un rendu MP4 aux paramètres prudents et n’ajoutez des sorties adaptatives que si le public et la durée le justifient.
- 3
Générez les images d’affiche et les sous-titres d’accessibilité au sein du même flux de travail multimédia reproductible.
- 4
Testez le balisage final avec la navigation au clavier, un mode de réduction des données, un réseau bridé et des échecs dus à des sources non prises en charge.
Quand Transloadit est utile
Utilisez /video/encode pour créer un rendu adapté à une lecture fiable, /video/thumbs pour générer des images d’affiche candidates, et /speech/transcribe avec /video/subtitle lorsqu’un flux de travail nécessite des sous-titres d’accessibilité. Uppy peut téléverser la source et suivre l’Assembly pendant la production de ces fichiers.
Périmètre architectural
Transloadit prépare les fichiers vidéo et indique la progression du traitement, mais le navigateur reste responsable des commandes de lecture, de la sémantique d’accessibilité, de la politique de lecture automatique et du comportement adaptatif du lecteur.
Questions fréquentes
Chaque vidéo doit-elle proposer plusieurs éléments source ?
Non. Ne proposez une source supplémentaire que si elle répond à un besoin mesuré de compatibilité ou de diffusion. Un seul rendu soigneusement validé peut être plus simple et moins coûteux à exploiter que plusieurs variantes inutilisées.
Pourquoi la lecture automatique fonctionne-t-elle sur un appareil mais échoue-t-elle sur un autre ?
La lecture automatique dépend de la politique du navigateur, des paramètres de l’appareil, de l’historique de l’utilisateur, de l’état de l’audio et des préférences d’accessibilité. La lecture automatique sans son a plus de chances d’être autorisée, mais la page doit tout de même gérer son refus et proposer une commande de lecture classique.
Peut-on publier une transcription générée automatiquement sans relecture ?
La transcription doit être relue lorsque l’exactitude est importante. Les noms, les accents, les paroles qui se chevauchent, le vocabulaire spécialisé et le bruit de fond peuvent entraîner des erreurs. Vérifiez aussi la synchronisation et les descriptions des sons significatifs avant d’utiliser le résultat comme sous-titres d’accessibilité.
Transloadit fournit-il le lecteur vidéo ?
Non. Transloadit peut préparer des rendus, des miniatures et des fichiers liés aux sous-titres d’accessibilité. L’application choisit ou développe le lecteur et reste responsable des commandes, de l’accessibilité, de la lecture automatique, de l’adaptation aux tailles d’écran et des tests dans les navigateurs.
Quelle valeur de preload convient le mieux ?
Utilisez none pour les pages où la lecture est peu probable ou qui affichent de nombreuses vidéos, et envisagez metadata lorsque la durée ou une préparation plus rapide à la lecture comptent. Comme preload est une indication, vérifiez le comportement réseau obtenu dans les navigateurs ciblés.