Avidemux/Betik dilini kullanma kılavuzu

Vikikitap, özgür kütüphane
Gezinti kısmına atla Arama kısmına atla

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:

  1. Dosyada istediğiniz değişiklikleri yapın
  2. Projeyi kaydedin. (örnek: /tmp/prj.js)
  3. /tmp/prj.js dosyasının içeriğini processFile fonksiyonunun içine kopyalayıp yapıştırın
  4. 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;
}

Ayrıca bakınız[değiştir]