Avidemux/Betik dilini kullanma kılavuzu
Bu sayfa Avidemux'la nasıl betik kullanılacağını anlatmaktadır.
Avidemux'un kullandığı betik motoru SpiderMonkey'dir, ve SpiderMonkey bir ECMAScript/JavaScript motorudur. Bu sayfada bir klasörün içindeki bütün video dosyalarının paketlenmiş frame'lerini paketlerden çıkaran basit bir betik yazacağız.
Başlıklar
[değiştir]Aşağıdaki iki satır hemen hemen bütün Avidemux betiklerinin ilk iki satırıdır:
//AD <- var app = new Avidemux();
İlk satır Avidemux'un dosyayı tanıması içindir ve her Avidemux betiğinde bulunmalıdır (en azından ilk dört karakter: //AD).
İkinci satırda Avidemux sınıfı türünden bir nesne oluşturulur. Hemen hemen bütün Avidemux fonksiyonlarına bu nesne üzerinden ulaşılır. Bu örneğimizde nesnenin adı "app"dır. Nesneye istediğiniz ismi verebilirsiniz.
Klasörleri belirleme
[değiştir]Şimdi bazı değişkenler tanımlayacağız ve kaynak ve hedef klasörleri belirleyeceğiz.
//AD <- /* orgDir klasörünü tarayıp AVI dosyalarının paketlenmiş frame'lerinin paketlerini çıkaran basit bir betik Sonuçta üretilen dosya destDir klasörüne koyuluyor Yeni directorySearch API'si kullanılıyor */ var app = new Avidemux(); var ds = new DirectorySearch(); var orgDir; var destDir; var reg =new RegExp(".$"); /* Bu Unix için. Windows için sep="\\"; yazın */ var sep="/"; var extension; var target;
Eğer betiğinizdeki dosya yollarını direkt kullanıyorsanız son / işaretini silmeyi unutmayın. Yani /dosya/bar/ yerine /dosya/bar olması gerekiyor.
Haydi şimdi kaynak ve hedef klasörleri kullanıcıdan isteyelim. Bunu yapmak için kullanıcıdan dosya isteyeceğiz ama bu dosyanın sadece klasör kısmını saklayacağız.
orgDir=fileReadSelect(); destDir=fileWriteSelect(); orgDir=pathOnly(orgDir); destDir=pathOnly(destDir); orgDir=orgDir.replace(reg,""); destDir=destDir.replace(reg,"");
Bu kodda sondaki / veya \ işaretini silmek için reg düzenli ifadesini kullandık.
Ana döngü
[değiştir]Şimdi klasörler belirlendi, şimdi bu klasörlerin içine bakabiliriz. Şimdi ilgili dosyaları alalım:
if(ds.Init(orgDir)) { // Sadece istediğimiz (AVI) dosyaları işlemek için if(!ds.isNotFile && !ds.isDirectory && !ds.isHidden && !ds.isArchive && !ds.isSingleDot && !ds.isDoubleDot) { extension=ds.GetExtension(); if(extension == "avi") { target=ds.GetFileName(); target=destDir+sep+target; processFile(orgDir+sep+ds.GetFileName(),target); } }
Şimdi sadece klasör olmayan ve avi uzantısına sahip dosyalara sahibiz, diğerlerini eledik. Elbetteki ihtiyaçlarınıza göre uzantıyı değiştirebilirsiniz. Şimdi ise sırada yolu silmek için reg2 düzenli ifadesini kullanmak var.
Eğer kaynak dosya /dump/icinde oldugunuz klasor/foo.avi, ve hedef klasör /tmp ise aşağıdaki meydana gelir:
target=foo.avi
target=/tmp +/+foo.avi=/tmp/foo.avi
Bir sonraki işlem hedef klasörü başa eklemek ve kaynak ve hedef dosyayla işleme dosyasını çağırmaktır.
Örnek:
source=/dump/icinde_oldugunuz_klasor +/+foo.avi=/dump/icinde_oldugunuz_klasor/foo.avi
target=/tmp+/+foo.avi=/tmp/foo.avi
processFile fonksiyonu
[değiştir]Ana döngümüz bitti. Şimdi asıl işi yapan fonksiyona geliyoruz. Fonksiyonumuz her bir dosyayı işleyecek ve ana döngümüz tarafından her bir dosya için çağrılacak.
function processFile(filename, targetfile) { // Dosyayı çağırma app.forceUnpack(); app.load(filename); app.rebuildIndex(); app.audio.delay=0; app.audio.mixer("NONE"); app.audio.scanVBR(); app.setContainer("AVI_UNP"); app.save(targetfile); return 1; }
Burada paketlenmiş bit akımlarını yok etmek için forceunpack ve sesin VBR MP3 olması ihtimalini göz önünde bulundurarak scanVBR fonksiyonlarını çağırdık. Daha sonra çıktı formatını AVI_UNP olarak belirledik ve kaydetmeyi tamamladık.
Elbetteki bu basit bir örnek. Eğer bir dosyayı işlemiş ve aynı işlemlerin bir dosya grubuna da yapılmasını istiyorsanız şunları yapın:
- Dosyada istediğiniz değişiklikleri yapın
- Projeyi kaydedin. (örnek: /tmp/prj.js)
- /tmp/prj.js dosyasının içeriğini processFile fonksiyonunun içine kopyalayıp yapıştırın
- filename ve targetfile'ı kaynak ve hedef dosyalar olacak şekilde değiştirin.
Burada ses ve video filtreleri ekleyebilme, kodeği değiştirebilme gibi birçok yapabileceğiniz şey vardır.
Tam betik
[değiştir]Bütün betik şunun gibi gözükür:
//AD <- /* orgDir klasörünü tarayıp AVI dosyalarının paketlenmiş frame'lerinin paketlerini çıkaran basit bir betik Sonuçta üretilen dosya destDir klasörüne koyuluyor Yeni directorySearch API'si kullanılıyor */ var app = new Avidemux(); var ds = new DirectorySearch(); var orgDir; var destDir; var reg =new RegExp(".$"); /* Bu Unix için Windows için sep="\\"; koyun reg2=new RegExp("\\.*\\"); */ var sep="/"; var reg2 =new RegExp("\/.*\/"); var extension; var target; // // // // kaynak ve hedef klasörlerden dosyaları seçme // orgDir=fileReadSelect(); destDir=fileWriteSelect(); orgDir=pathOnly(orgDir); destDir=pathOnly(destDir); // // son \\ veya // karakter dizisini silme // orgDir=orgDir.replace(reg,""); destDir=destDir.replace(reg,""); print("orgDir : <"+orgDir+">"); print("destDir : <"+destDir+">"); // // Başlıyoruz // if(ds.Init(orgDir)) { while(ds.NextFile()) { // Yalnızca istediğimiz (AVI) dosyaları işleme if(!ds.isNotFile && !ds.isDirectory && !ds.isHidden && !ds.isArchive && !ds.isSingleDot && !ds.isDoubleDot) { extension=ds.GetExtension(); if(extension == "avi") { target=ds.GetFileName(); target=destDir+sep+target; print("***"+ds.GetFileName()+"-->"+target); processFile(orgDir+sep+ds.GetFileName(),target); } //print("File: "+ds.GetFileName()+" is "+ds.GetFileSize()+" bytes, extension "+extension); } } print("We just searched in directory \"" + ds.GetFileDirectory() + "\""); ds.Close(); } else displayError("Error initializing the directory search"); displayInfo("Finished !"); function processFile(filename, targetfile) { // Load the file app.forceUnpack(); app.load(filename); app.rebuildIndex(); app.audio.delay=0; app.audio.mixer("NONE"); app.audio.scanVBR(); app.setContainer("AVI_UNP"); app.save(targetfile); return 1; }