Bienvenue, Invité
25 avril 2024, 10:06:56
Nouvelles: Nous espérons que la nouvelle version du forum de Trad-Fr vous ravira.

Auteur Sujet: Encoder en masse des fichiers en DivX multipasse  (Lu 3521 fois)

vanjeje

  • Nouveau Membre
  • *
  • Hors ligne Hors ligne
  • Messages: 1
Encoder en masse des fichiers en DivX multipasse
« le: 07 novembre 2006, 01:34:51 »

Bonjour,

Juste pour info si cela peut être utile, voici mon début d'expérience d'une dizaine d'heures avec VirtualDub-MPEG2 (personnellement j'ai décidé pour mon besoin précis d'utiliser SUPER© de eRightSoft).

Contexte : encoder en DivX un grand nombre de fichiers (qui ne passent pas sur mon lecteur DVD) enregistrés avec adslTV depuis Freebox en multiposte, format MPEG-2 PS, 720 x 576 x 25 fps, débit d'environ 3 Mbps. Un script Ruby génère un .jobs à lancer depuis VirtualDub.
Ce n'est pas tout à fait au point, les noms des fichiers dans le .jobs doivent être en équivalents UTF-8, or Ruby ne gère pas encore bien cela ; cela ne fonctionne que pour des noms de fichiers sans accents par exemple ; pour mon test, j'ai créé mon .jobs en Unicode (heureusement c'est bien digéré par VirtualDub), et j'ai corrigé à la main les quelques accents que j'avais (voir remarques).

J'utilise VirtualDub-MPEG2, j'ai installé le codec DivX 6.4.0 pour tester, ainsi que Lame pour le son (avec Lame ACS).
Après un peu de tâtonnements, l'utilisation simple de VirtualDub devient vite intuitive. Donc pour l'encodage en 2 passes, premier encodage Multipasse, 1ère passe qui ne génère "rien" (sauf le son, mais surtout un log nécessaire pour la suite), le second encodage Multipasse, énième passe est le bon. J'ai enregistré les configurations de chaque passe dans deux fichiers que j'ai nommés DivXpass1.vcf et DivXpass2.vcf ; en plus de la compression à 960 kbps, son 48 khz 128 kbps stéréo, j'ai juste mis deux filtres vidéo, un désentrelacement deinterlace et un redimensionnement resize à 640 x 480 (limites maxi du codec DivX).
J'ai trouvé sur le site d'Eric Phelps un tutorial intéressant, créant un fichier .jobs à partir d'un programme VBS et d'une configuration .vcf
Le programme étant un peu monstrueux, et étant un adepte de Ruby, j'ai tenté la même chose en plus simple :
- coller dans un fichier DivXpass12.vcf les contenus de DivXpass1.vcf et DivXpass2.vcf, avec juste une instruction supplémentaire entre les deux, VirtualDub.RunNullVideoPass(); qui assure la première passe sans générer de fichier de sortie ; tel quel ce fichier de configuration n'est pas utilisable pour un job "manuel", car la première passe s'exécute tout de suite ;
- j'ai copié la structure d'un fichier .jobs (visiblement il suffit d'intégrer le contenu d'un .vcf avec quelques instructions supplémentaires, ouverture du fichier et enregistrement du résultat), que je génère avec un petit script Ruby (sous Windows XP, j'utilise simplement le one click installer, s'installe très facilement)
- yapuka lancer le .jobs depuis VirtualDub, apparemment cela fonctionne plutôt bien.

Fichier createjob.rb
#
$KCODE='u'

vcfName = "C:/Program Files/VirtualDubMPEG2/DivXpass12.vcf"
inputPath = "C:/Captures"
outputPath = "C:/ConversionDivX"
jobName = "Encoding.jobs"
extensions = ["*.MPG"]
jobGlobHeader = %Q{// VirtualDub job list (Sylia script format)
// This is a program generated file -- edit at your own risk.
//
// $numjobs @jobcount@
//

}
jobHeader = %Q{// $job "Job @jobno@"
// $input "@fullinputfile@"
// $output "@fulloutputfile@"
// $state 0
// $start_time 0 0
// $end_time 0 0
// $script

VirtualDub.Open("@fullinputfileescaped@");
}
jobTrailer = %Q{VirtualDub.project.ClearTextInfo();
VirtualDub.SaveAVI("@fulloutputfileescaped@");
VirtualDub.audio.SetSource(1);
VirtualDub.Close();

}

vcfFile = File.open(vcfName)
vcfS = vcfFile.read
vcfFile.close

Dir.chdir(inputPath)
puts Dir.pwd
fList = []
extensions.each { |ext| fList.concat Dir[ext] }
fList.sort!
fList.each { |x| puts x }

if !fList.empty?
  jobFile = File.open(jobName, "w")
  jobFile << jobGlobHeader.gsub("@jobcount@", fList.size.to_s)
  i = 0
  fList.each { |f|
    i += 1
    jobFile << jobHeader.gsub("@jobno@", i.to_s
                    ).gsub("@fullinputfile@", inputPath + "/" + f
                    ).gsub("@fulloutputfile@", outputPath + "/out" + f
                    ).gsub("@fullinputfileescaped@", inputPath + "/" + f)
    jobFile << vcfS
    jobFile << jobTrailer.gsub("@fulloutputfileescaped@", outputPath + "/out" + f)
  }
  jobFile.close
end


Remarques :
- c'est de l'à peu près développé à la va-vite, j'ai cherché pendant un moment ce genre d'info sans trouver grand chose de simple ; cela peut être utilisé pour d'autres transformations de fichiers par VirtualDub ;
- désolé pour l'anglais, j'ai pris l'habitude de développer ainsi ;
- tout ce qu'il y a entre les accolades d'un %Q{} constitue une seule chaîne de caractères ;
- j'ai créé le fichier .rb avec SciTE (installé par le Ruby one click installer) en ayant modifié les propriétés globales pour le créer en Unicode. C'est apparemment nécessaire pour faire fonctionner Ruby avec $KCONFIG='u', et générer en sortie un fichier Unicode également ;
- cela se lance depuis une console cmd (je conseille un mode con cp select=1252 pour se mettre en simili Latin1), par ruby -Ku createjob.rb (le -Ku est probablement redondant avec le $KCONFIG='u')
- le fichier Encoding.jobs est créé dans le répertoire inputPath ;
- c'est plutôt intuitif le Ruby non ?

Conclusion : je suis arrivé à mes fins, mais je viens de m'apercevoir que le résultat est pratiquement aussi bon avec SUPER© (merci Micro Hebdo qui me l'a fait découvrir!) ; très simplifié, fonctionne d'office en batch, codecs DivX et MP3 intégrés. Par contre je suis un peu déçu, un fichier de 78,8 MiB (Migi Byte, multiple de 1024 par opposition au Mega Byte multiple de 1000), après petite réduction de taille et compression avec une assez bonne qualité, donne 47,2 MiB. J'espérais une meilleure compression.
IP archivée