VIVE LA RÉVOLUTION
Accueil du site > Comment publier un article > Yt-dlp - ffmpeg - Intégrer sous-titres visible dans vidéo

Yt-dlp - ffmpeg - Intégrer sous-titres visible dans vidéo

mardi 1er septembre 2026, par anonyme (Date de rédaction antérieure : 1er septembre 2026).

IA de google ( les deux premières réponses fonctionnent=

Ma commande est : ffmpeg -i Exemple.mp4 ^ -vf subtitles= Exemple.srt ^ -c:v libx264 ^ -c:a copy ^ Exemple_subs.mp4 Exemple.mp4 est lkisible dans un enregistreur TNT mais pas Exemple_subs.mp4 ?as
 
Le problème d'illisibilité de votre fichier Exemple_subs.mp4 sur votre enregistreur ou décodeur TNT vient principalement du fait que votre commande laisse FFmpeg choisir par défaut le profil d'encodage vidéo (souvent le profil High ou High 10-bit en YUV 444p/422p selon votre version). Les puces matérielles des décodeurs TNT de salon sont anciennes et très strictes : elles ne supportent généralement que le profil H.264 Main ou High (8-bit) avec un format de pixels strictement fixé à YUV 420p. [1]

La commande corrigée à utiliser

Pour garantir une compatibilité maximale avec votre enregistreur TNT, ajoutez l'argument -pix_fmt yuv420p et forcez le profil à main avec un niveau matériel standard (comme 4.1). [1, 2]
Voici la commande corrigée (compatible avec la syntaxe Windows grâce aux symboles ^) :
ffmpeg -i Exemple.mp4 ^
-vf "subtitles=Exemple.srt" ^
-c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 ^
-c:a copy ^
Exemple_subs.mp4

Pourquoi la première vidéo fonctionnait et pas la deuxième ?

  • Exemple.mp4 (Original) : Il a probablement été encodé par un appareil ou un logiciel grand public respectant déjà les normes strictes de diffusion (ex: YUV 420p, Profile Main/High). Votre décodeur TNT le lit donc de manière fluide.
  • Exemple_subs.mp4 (Modifié) : Pour "incruster" (graver) les sous-titres dans l'image, FFmpeg est obligé de décoder puis de réencoder la piste vidéo (-c:v libx264). Sans précision de votre part, FFmpeg choisit des réglages modernes et optimisés pour les ordinateurs récents, que la puce électronique du décodeur TNT est incapable de décoder matériellement. [3]

Les 3 détails qui bloquent un décodeur TNT

  1. Le format de pixels (-pix_fmt yuv420p) : Sans cela, FFmpeg réencode parfois dans un format de couleur supérieur (ex: YUV 444p). Les téléviseurs et décodeurs TNT affichent un écran noir ou une erreur de format s'ils reçoivent autre chose que du 420p. [1]
  2. Le profil et le niveau (-profile:v main -level 4.1) : Les profils trop avancés demandent trop de puissance de calcul pour ces petits boîtiers. Restreindre au profil main résout 95 % des problèmes sur le matériel de salon. [1, 2]
  3. Les guillemets autour du filtre (-vf "subtitles=Exemple.srt") : Si le nom de votre fichier SRT ou son chemin d'accès contient un jour un espace ou un caractère spécial, FFmpeg plantera immédiatement sans ces guillemets. [4]
Si le problème persiste malgré cela, le format de la piste audio d'origine (recopiée à l'identique avec -c:a copy) pourrait aussi être en cause, bien que ce soit plus rare. Souhaitez-vous que nous vérifiions ensemble le format audio ou les dimensions de l'image (résolution) si la vidéo ne se lance toujours pas ?
 
Autre chose. La vidéo obtenue faisait un poids double de la vidéo originale !
 
L'augmentation excessive du poids s'explique par le fait que votre commande initiale n'indiquait aucun réglage de qualité (débit binaire) à FFmpeg, qui a donc réencodé la vidéo avec des paramètres par défaut beaucoup trop généreux.
Pour graver les sous-titres, FFmpeg doit obligatoirement reconstruire chaque image. Si vous ne fixez pas de limite, il applique un réglage standard (CRF 23) qui peut facilement doubler le poids si la vidéo d'origine était déjà très compressée.

La commande corrigée pour maîtriser le poids et préserver la compatibilité TNT

Pour retrouver un poids similaire à l'original tout en restant compatible avec votre décodeur, ajoutez l'argument -crf 28 (qui augmente légèrement la compression sans perte visuelle visible sur un téléviseur) ou -preset medium :
ffmpeg -i Exemple.mp4 ^
-vf "subtitles=Exemple.srt" ^
-c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium ^
-c:a copy ^
Exemple_subs.mp4

Les deux méthodes pour contrôler précisément la taille du fichier

Selon vos préférences, vous pouvez utiliser deux techniques différentes dans votre commande :

Methode 1 : Le mode CRF (Recommandé)

Le paramètre -crf (Constant Rate Factor) ajuste la compression selon la complexité des images.
  • Fonctionnement : L'échelle va de 0 (sans perte, fichier énorme) à 51 (qualité horrible).
  • Réglage : Un CRF entre 25 et 28 offre un excellent compromis pour les vieux lecteurs de salon : l'image reste propre et le fichier final sera souvent plus léger ou égal à l'original.

Méthode 2 : Le ciblage par Bitrate (Débit fixe)

Si vous voulez contraindre FFmpeg à copier exactement le même débit que l'original (par exemple 2 Megabits par seconde) :
  • Argument à ajouter : -b:v 2M (remplacez 2M par le débit de votre vidéo d'origine).
  • Vérification : Vous pouvez connaître le débit de votre fichier d'origine en faisant un clic droit sur Exemple.mp4 > Propriétés > Détails > Débit total des données.
Souhaitez-vous que nous adaptions la commande avec un débit précis (Bitrate) basé sur les détails de votre vidéo d'origine ?

Comment faire en une seule commande pour télécharger une vidéo youtube avec la commande yt-dlp en utilisant deno ET la transformer pour intégrer les sous-titres comme avec la commande : « ffmpeg -i Exemple.mp4 ^ -vf "subtitles=Exemple.srt" ^ -c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium ^ -c:a copy ^ Exemple_subs.mp4 » ?
 
Pour exécuter cela en une seule commande avec yt-dlp, vous n'avez pas besoin d'utiliser Deno (qui est un runtime JavaScript/TypeScript). yt-dlp intègre nativement un argument nommé --exec qui permet de passer automatiquement la vidéo téléchargée à votre commande FFmpeg personnalisée dès que le téléchargement est terminé.

La commande unique (Syntaxe Windows CMD)

Voici la commande complète à copier-coller dans votre terminal Windows. Elle télécharge la vidéo, récupère les sous-titres associés, puis lance l'encodage de compatibilité TNT :
yt-dlp "URL_YOUTUBE" --write-subs --sub-format srt --ffmpeg-location "C:cheminversffmpeg.exe" --exec "ffmpeg -i {} -vf "subtitles=%(requested_subtitles.fr.filepath)s" -c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium -c:a copy "%(title)s_subs.mp4""

Comment fonctionne cette commande ?

  • --write-subs --sub-format srt : Demande à yt-dlp de télécharger le fichier de sous-titres au format .srt.
  • --ffmpeg-location : Indique à yt-dlp où se trouve votre fichier ffmpeg.exe (optionnel si FFmpeg est déjà configuré dans les variables d'environnement de votre système).
  • --exec "..." : Exécute la commande située entre guillemets immédiatement après le téléchargement.
  • {} : Ce symbole est automatiquement remplacé par le nom du fichier vidéo que yt-dlp vient de télécharger.
  • %(requested_subtitles.fr.filepath)s : Ce code dynamique transmet automatiquement à FFmpeg le chemin exact du fichier sous-titres téléchargé (ici l'exemple cible le français .fr, remplacez par la langue voulue si nécessaire).
  • " : Les guillemets internes sont précédés d'un antislash pour que Windows comprenne qu'ils font partie de la sous-commande FFmpeg.

Alternative si vous devez absolument utiliser un script Deno

Si votre projet impose l'utilisation de Deno (par exemple au sein d'une application JavaScript), vous devez créer un script download.js qui orchestre les deux processus via Deno.Command :
// download.js
const url = "URL_YOUTUBE";

// 1. Étape yt-dlp
const ytdlp = new Deno.Command("yt-dlp", {
  args: [url, "--write-subs", "--sub-format", "srt", "-o", "Exemple.%(ext)s"],
});
await ytdlp.output();

// 2. Étape FFmpeg
const ffmpeg = new Deno.Command("ffmpeg", {
  args: [
    "-i", "Exemple.mp4",
    "-vf", "subtitles=Exemple.fr.srt",
    "-c:v", "libx264", "-pix_fmt", "yuv420p", "-profile:v", "main", "-level", "4.1", "-crf", "28", "-preset", "medium",
    "-c:a", "copy",
    "Exemple_subs.mp4"
  ],
});
await ffmpeg.output();
console.log("Vidéo TNT prête !");
Pour exécuter ce script, vous utiliseriez la commande : deno run --allow-run download.js.
Rencontrez-vous des difficultés pour extraire une langue de sous-titres spécifique (comme les sous-titres générés automatiquement par YouTube) avec yt-dlp ?
La même chose, mais en acceptant les sous-titre autogénérés svp
 
Pour accepter les sous-titres autogénérés de YouTube (qui ne sont pas stockés de la même manière que les sous-titres créés par les utilisateurs), il faut remplacer l'argument --write-subs par --write-auto-subs dans votre commande yt-dlp.
Voici la solution complète mise à jour.

1. La commande unique modifiée

Exécutez cette commande dans votre terminal Windows. Elle demande à yt-dlp de récupérer en priorité le sous-titre officiel français, et s'il n'existe pas, de télécharger le sous-titre automatique français.
yt-dlp --write-auto-subs --sub-langs fr --convert-subs srt ^
--exec "deno run --allow-run script.js" ^
"URL_DE_LA_VIDEO_YOUTUBE"

2. Le script Deno mis à jour (script.js)

Les sous-titres automatiques téléchargés par yt-dlp portent souvent l'extension .fr.vtt avant d'être convertis. Pour éviter que FFmpeg ne plante si le nom du fichier sous-titre est légèrement différent, le script Deno ci-dessous intègre désormais une vérification automatique du fichier .srt réellement présent sur votre disque.
Remplacez le contenu de votre fichier script.js par celui-ci :
import { existsSync } from "https://deno.land";

// Deno récupère le nom du fichier vidéo téléchargé par yt-dlp
const videoOriginale = Deno.args[0];

// On extrait la racine du nom du fichier (sans l'extension .mp4 / .mkv)
const baseName = videoOriginale.replace(/.[^/.]+$/, "");

// Chemins potentiels pour le fichier SRT selon le type de sous-titre YouTube
const srtOfficiel = `${baseName}.fr.srt`;
const srtAuto = `${baseName}.fr.live_chat.srt`; // Cas rare des directs
let srtFile = srtOfficiel;

// Si le fichier officiel n'existe pas, on cherche une variante générée
if (!existsSync(srtOfficiel)) {
  // Recherche d'un fichier se terminant par .srt dans le même dossier
  for (const entry of Deno.readDirSync(".")) {
    if (entry.isFile && entry.name.startsWith(baseName) && entry.name.endsWith(".srt")) {
      srtFile = entry.name;
      break;
    }
  }
}

const videoSortie = `${baseName}_subs.mp4`;

if (!existsSync(srtFile)) {
  console.error(`Erreur : Aucun fichier de sous-titres (.srt) trouvé pour la vidéo.`);
  Deno.exit(1);
}

console.log(`Fichier SRT détecté : ${srtFile}`);
console.log(`Incrustation en cours (Profil TNT) dans : ${videoSortie}...`);

// Exécution de la commande FFmpeg compatible TNT
const commande = new Deno.Command("ffmpeg", {
  args: [
    "-i", videoOriginale,
    "-vf", `subtitles=${srtFile}`,
    "-c:v", "libx264",
    "-pix_fmt", "yuv420p",
    "-profile:v", "main",
    "-level", "4.1",
    "-crf", "28",
    "-preset", "medium",
    "-c:a", "copy",
    videoSortie
  ],
});

const { success } = await commande.output();

if (success) {
  console.log("Traitement terminé avec succès !");
} else {
  console.error("Une erreur est survenue lors du réencodage FFmpeg.");
}

Ce qui change avec cette configuration

  • --write-auto-subs : Autorise explicitement le téléchargement de la transcription automatique de YouTube si aucun sous-titre classique n'a été fourni par le créateur.
  • Robustesse du script : YouTube applique parfois l'extension .fr-orig.srt ou .fr.srt selon que la vidéo a été traduite ou générée. La boucle Deno.readDirSync scanne le dossier pour lier le bon fichier .srt à FFmpeg à coup sûr.
Voulez-vous que le script supprime automatiquement les fichiers temporaires (la vidéo d'origine sans sous-titres et le fichier .srt) une fois que la vidéo finale pour la TNT est créée ?

avec « yt-dlp "https://www.youtube.com/watch?v=mYRlGKZNjAw" --write-auto-subs --sub-langs fr --sub-format srt --ffmpeg-location "ffmpeg.exe" --exec "ffmpeg -i {} -vf "subtitles=%(requested_subtitles.fr.filepath)s" -c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium -c:a copy "%(title)s_subs.mp4"" » ça répond : « At least one output file must be specified
L'erreur « At least one output file must be specified » renvoyée par FFmpeg signifie qu'il n'a pas réussi à identifier le nom du fichier vidéo de sortie dans votre bloc de commande.
Ce problème est provoqué par la syntaxe dynamique %(title)s. Lorsque le titre de la vidéo YouTube contient des caractères spécifiques (comme des espaces, des apostrophes ou des accents), la variable s'affiche mal dans la sous-commande Windows et brise la structure de FFmpeg.
Voici les deux solutions pour corriger immédiatement ce problème :

Solution 1 : Forcer un nom de sortie fixe (Le plus simple et robuste)

Pour éviter que les titres des vidéos ne fassent planter la commande, fixez un nom générique simple pour le fichier final (par exemple video_tnt.mp4).
yt-dlp "https://www.youtube.com/watch?v=mYRlGKZNjAw" --write-auto-subs --sub-langs fr --sub-format srt --ffmpeg-location "ffmpeg.exe" --exec "ffmpeg -i {} -vf "subtitles=%(requested_subtitles.fr.filepath)s" -c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium -c:a copy video_tnt.mp4"

Solution 2 : Conserver le titre YouTube (Syntaxe corrigée)

Si vous tenez absolument à ce que le fichier porte le nom de la vidéo, il faut échapper les guillemets de manière plus stricte et utiliser un filtre de nettoyage natif à yt-dlp pour nettoyer le titre avant de le donner à FFmpeg.
Ajoutez l'argument windows dans la variable pour qu'elle retire les caractères interdits :
yt-dlp "https://www.youtube.com/watch?v=mYRlGKZNjAw" --write-auto-subs --sub-langs fr --sub-format srt --ffmpeg-location "ffmpeg.exe" --exec "ffmpeg -i {} -vf "subtitles=%(requested_subtitles.fr.filepath)s" -c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium -c:a copy "%(title)s_subs.mp4""
Note : Si cette méthode échoue encore sur certaines vidéos à cause de la gestion des guillemets imbriqués par Windows CMD, la Solution 1 reste la méthode infaillible.
Souhaitez-vous également que la commande supprime automatiquement le fichier d'origine et le fichier de sous-titres .srt une fois que votre version finale compatible TNT est générée ?


Avec: « ffmpeg -i Exemple.mp4 ^ -vf "subtitles=Exemple.srt" ^ -c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium ^ -c:a copy ^ Exemple_subs.mp4 » la vidéo n'est toujours pas supportée par l'enregistreur TNT
 
Si votre enregistreur TNT refuse toujours la vidéo malgré le profil H.264 main et le format yuv420p, le problème ne vient plus de la vidéo elle-même, mais très probablement du format de la piste audio d'origine ou de la structure interne du fichier MP4.
La commande utilisait -c:a copy, ce qui signifie que FFmpeg recopiait l'audio de YouTube tel quel (souvent du format Opus ou AAC avancé), des formats que les puces des vieux décodeurs TNT de salon sont incapables de décoder.

La solution : Forcer un encodage audio standard (MP3 ou AC3)

Pour débloquer votre enregistreur, il faut réencoder la piste audio en MP3 (ou en AC3 / Dolby Digital), qui sont les deux seuls formats audio universellement acceptés par 100 % des terminaux TNT.
Voici la commande corrigée à exécuter :
ffmpeg -i Exemple.mp4 ^
-vf "subtitles=Exemple.srt" ^
-c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium ^
-c:a libmp3lame -ar 44100 -ac 2 ^
Exemple_subs.mp4

Ce qui change dans cette commande :

  • -c:a libmp3lame : Remplace le copier-coller (copy) par un réencodage propre de l'audio au format MP3 standard.
  • -ar 44100 : Force la fréquence d'échantillonnage à 44.1 kHz, la norme de compatibilité la plus sûre.
  • -ac 2 : Force le son en Stéréo (2 canaux). Si la vidéo d'origine possédait une piste en son multicanal 5.1, le décodeur TNT pouvait saturer et rejeter le fichier.

Autre piste : Le format de conteneur (si le MP3 échoue)

Certains enregistreurs TNT (notamment les marques CGV, Strong ou Sagemcom) préfèrent le format .MKV ou .TS (MPEG-TS) plutôt que le .MP4 pour la lecture de fichiers externes.
Si la commande ci-dessus affiche encore une erreur sur votre écran, changez simplement l'extension du fichier de sortie en remplaçant Exemple_subs.mp4 par Exemple_subs.mkv.
Si le fichier ne se lance toujours pas, votre enregistreur affiche-t-il un message d'erreur précis à l'écran (ex: "Format non supporté", "Codec audio non géré", ou écran noir) ?
Si lee AAC fonctionne comment faire ?
 
Si le format AAC est bien supporté par votre enregistreur TNT, le problème ne vient plus de l'audio. Le blocage restant est presque à coup sûr lié à la résolution de l'image (Ex: 1080p à 60 images par seconde) ou au nombre d'images de référence (RefFrames).
Les vidéos YouTube modernes sont souvent diffusées en 60 images par seconde (fps). Les puces matérielles des anciens enregistreurs TNT saturent et refusent de lire une vidéo si elle dépasse 30 images par seconde ou si sa définition est trop haute.

La commande à utiliser pour tester le format AAC valide

Voici la commande qui force une structure vidéo ultra-standard (1080p maximum à 30 images par seconde, indispensable pour le matériel de salon) tout en conservant le son en AAC :
ffmpeg -i Exemple.mp4 ^
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,subtitles=Exemple.srt,fps=30" ^
-c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium -bf 2 -vtag avc1 ^
-c:a aac -b:a 128k -ar 48000 ^
-movflags +faststart ^
Exemple_subs.mp4

Ce que cette commande sécurise en plus :

  • fps=30 : Force la vidéo à un maximum de 30 images par seconde. Si votre fichier d'origine était en 50fps ou 60fps, l'enregistreur TNT l'ignorait par sécurité.
  • scale=1920:1080... : Redimensionne proprement la vidéo en Full HD standard (1080p) maximum sans déformer l'image (elle ajoute des bandes noires si la vidéo YouTube a un format original ou vertical), garantissant que le décodeur matériel peut l'afficher.

Si cela ne fonctionne toujours pas (Le test ultime en 720p)

Certains enregistreurs TNT low-cost ou plus anciens ne gèrent tout simplement pas le 1080p pour les fichiers externes (clés USB) et se limitent au 720p HD.
Si la commande ci-dessus échoue, remplacez simplement les valeurs 1920:1080 par 1280:720 dans les filtres de la commande comme ceci :
ffmpeg -i Exemple.mp4 ^
-vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,subtitles=Exemple.srt,fps=30" ^
-c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.1 -crf 28 -preset medium -bf 2 -vtag avc1 ^
-c:a aac -b:a 128k -ar 48000 ^
-movflags +faststart ^
Exemple_subs.mp4
Quelle est la marque ou le modèle de votre enregistreur TNT ? Je pourrais vérifier ses limitations techniques exactes (résolution maximale et codecs officiels) pour cibler instantanément le bon réglage.
AMTC DTHD168R
 
Le décodeur AMTC DTHD168R est un appareil d'entrée de gamme. Sa puce multimédia USB souffre d'une limitation majeure : bien qu'il reçoive les chaînes TV en HD (1080i), son lecteur multimédia USB embarqué bloque ou saccade dès qu'un fichier vidéo dépasse 25 ou 30 images par seconde, ou si l'agencement interne du fichier MP4 n'est pas optimisé pour le streaming local (indexation manquante). [1]
Pour valider le format vidéo H.264 et le format audio AAC tout en forçant l'appareil à accepter votre fichier, vous devez obligatoirement :
  1. Verrouiller la cadence à 25 ou 30 images par seconde (YouTube fournit souvent du 50 ou 60 fps que l'AMTC rejette).
  2. Ajouter l'option d'indexation rapide (-movflags +faststart) pour que la puce lise l'en-tête du fichier dès le début de la clé USB.

La commande FFmpeg définitive pour l'AMTC DTHD168R

Copiez et collez cette commande dans votre terminal Windows (avec les symboles ^ de saut de ligne) :
ffmpeg -i Exemple.mp4 ^
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,subtitles=Exemple.srt,fps=25" ^
-c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.0 -crf 26 -preset medium ^
-c:a aac -b:a 128k -ar 48000 ^
-movflags +faststart ^
Exemple_subs.mp4

Pourquoi cette version va débloquer votre lecteur AMTC ?

  • fps=25 : Calque la fluidité sur la norme de diffusion TV française (PAL / 25 images par seconde). Cela soulage instantanément le processeur de votre boîtier AMTC.
  • -movflags +faststart : Déplace les index de la vidéo (les métadonnées) au tout début du fichier .mp4. Sans cela, l'enregistreur TNT cherche les informations à la fin du fichier, plante sur la clé USB et affiche "Format non supporté".
  • -level 4.0 : Descend d'un cran la complexité du décodage matériel (la commande précédente était en 4.1) pour correspondre exactement aux puces économiques utilisées par AMTC. [1]
  • -c:a aac -b:a 128k -ar 48000 : Encode proprement l'audio en AAC standard stéréo échantillonné à 48 kHz, qui est le format natif de la TNT HD en France.
Si l'appareil affiche toujours un écran noir, la puce USB de l'AMTC préfère peut-être le format de conteneur d'enregistrement brut. Voulez-vous que l'on teste la même configuration mais encapsulée dans un fichier .mkv ou .ts ? [2]
 
 

Avec yt-dlp --js-runtimes deno ^ --extractor-args youtube:player_client=web_embedded ^ -f bv*[vcodec*=avc1]+ba[acodec*=mp4a]/b[ext=mp4] ^ --write-subs ^ --write-auto-subs ^ --sub-langs fr ^ --embed-subs ^ --convert-subs srt ^ --merge-output-format mp4 ^ https://youtu.be/7b1yIgBorSc , J obtiens une vidéo qui fonctionne sur mon enregistreur TNT AMTC DTHD168R . Puis je rajpoute des sous-titres avec ffmpeg -i Exemple.mp4 ^ -vf scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,subtitles=Exemple.srt,fps=25 ^ -c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.0 -crf 26 -preset medium ^ -c:a aac -b:a 128k -ar 48000 ^ -movflags +faststart ^ Exemple_subs.mp4 , ça marche sur l Ordi, mais la vidéo n est pas acceptée par mon enregistreur TNT AMTC DTHD168R.
 
Le problème vient du fait que votre enregistreur TNT AMTC DTHD168R possède un processeur matériel très strict. La commande FFmpeg que vous utilisez recrée entièrement la vidéo (encodage), ce qui modifie des paramètres structurels invisibles que votre appareil rejette, contrairement à yt-dlp qui télécharge le flux brut directement compatible.
Voici les causes probables du rejet et comment résoudre le problème sans perdre de temps en réencodage.

Pourquoi votre enregistreur rejette la vidéo FFmpeg ?

  1. Le format audio (AAC-LC vs AAC-MAIN) : FFmpeg utilise par défaut le profil AAC-LC, mais selon la version, il peut insérer des données d'en-tête (ADTS) que les puces de salon bas de gamme ne gèrent pas.
  2. L'organisation des paquets (Muxing) : L'option -movflags +faststart déplace l'index (moov atom) au début du fichier. C'est parfait pour le streaming web, mais cela perturbe souvent les vieux lecteurs multimédias matériels qui s'attendent à le trouver à la fin.
  3. Le conteneur MP4 : Ces appareils préfèrent souvent le format MKV ou AVI pour la lecture de fichiers externes, ou un codec vidéo strictement limité en encodage (comme le format Xvid ou un H.264 très basique sans options avancées de compression).

La Solution IDÉALE : L'incrustation directe avec yt-dlp ��

Pourquoi faire l'incrustation avec FFmpeg dans un second temps alors que yt-dlp peut demander à FFmpeg d'incruster (hardcoder) les sous-titres directement pendant le téléchargement ?
Puisque le fichier de base de yt-dlp fonctionne sur votre appareil, laissez-le tout gérer d'un coup. Utilisez cette commande unique :
yt-dlp --js-runtimes deno ^
 --extractor-args youtube:player_client=web_embedded ^
 -f bv*[vcodec*=avc1]+ba[acodec*=mp4a]/b[ext=mp4] ^
 --write-subs --write-auto-subs --sub-langs fr ^
 --embed-subs --convert-subs srt ^
 --exec "ffmpeg -i {} -vf subtitles={}:force_style='FontSize=12' -c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.0 -crf 26 -c:a copy -merge-output-format mp4 {}.subs.mp4" ^
 https://youtu.be/7b1yIgBorSc
(Note : L'argument --exec va forcer yt-dlp à passer le fichier téléchargé proprement à FFmpeg pour graver les sous-titres en copiant l'audio à l'identique -c:a copy).

La Solution de secours : Corriger votre commande FFmpeg

Si vous devez absolument utiliser votre méthode en deux étapes, modifiez votre commande FFmpeg pour retirer le faststart et harmoniser l'audio.
Essayez cette version corrigée :
ffmpeg -i Exemple.mp4 ^
 -vf scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,subtitles=Exemple.srt,fps=25 ^
 -c:v libx264 -pix_fmt yuv420p -profile:v main -level 4.0 -crf 26 -preset medium ^
 -c:a copy ^
 Exemple_subs.mp4
Ce qui change ici :
  • -c:a copy : On ne touche pas à l'audio. On garde exactement la piste récupérée par yt-dlp qui, elle, plaisait à votre enregistreur.
  • Suppression de -movflags +faststart : L'index reste à la fin du fichier, une structure standard pour les puces TNT de salon.
Si vous souhaitez affiner l'affichage des sous-titres (comme la taille de la police ou la couleur sur l'écran de votre TV), faites-le-moi savoir !

 
 
 
 
 
 
 
 
 

Répondre à cet article

SPIP | squelette | | Plan du site | Suivre la vie du site RSS 2.0