İçeriğe atla

Avidemux/Toplu işleme

Vikikitap, özgür kütüphane

Bu sayfa toplu işlemenin Avidemux'ta nasıl yapıldığını anlatmaya çalışacaktır. "Toplu işleme" derken birden fazla video dosyasının aynı ayarlarla kaydedilmesi ve bir dosyanın işi bittiğinde diğer dosyaya geçmek için kullanıcının herhangi bir müdahalesinin gerekmemesini kastediyoruz. Örneğin birden fazla dosyanın formatını belirli bir formata değiştirmek istediğinizde burada anlatacaklarımız son derece faydalı olacaktır.

Toplu işleme yöntemleri

[değiştir]

AVIdemux hem komut satırı kullanımını ve hem de betik yazımını (ECMAScript) desteklediği için Avidemux'ta toplu işlemenin birden fazla yolu vardır:

  • Kabuk betiği/.bat dosyası veya benzer bir yöntem aracılığıyla sadece komut satırı toplu işlemesi
  • Sadece JS betiği (ECMAScript) toplu işlemesi
  • Komut satırı ve JS betiğinin her ikisini de kullanarak toplu işleme

Sadece komut satırını kullanarak toplu işleme

[değiştir]

AVIdemux komut satırı sınırlı sayıda ayarın değiştirilmesine imkan verir. Ancak basit format dönüşümleri için uygundur. Ek komut satırı araçları kullanmanıza izin verir, bu sayede YouTube'a dosya yüklemenizi AVIdemux dosyaları işledikten sonra otomatikleştirebilirsiniz. Farklı işletim sistemleri ve kabuklar farklı dosya ismi kısıtları, farklı komutlar, vb. içerebildiği için aşağıdaki komut örneklerinden bazıları tüm sistemlerde/kabuklarda çalışmayabilir.

Aşağıdaki Win32 örneği (.bat dosyası) aktif klasör içindeki bütün .mp4 dosyalarını .avi'ye (Xvid+MP3) dönüştürür. Asıl dosyalar değiştirilmeyecektir. Yeni dosyaların ismi onceki_isim.mp4.avi formatında olacaktır.

set avidemux="C:\Program Files\Avidemux 2.5\avidemux2.exe"
set videocodec=Xvid
set audiocodec=MP3
for %%f in (*.mp4) do %avidemux% --video-codec %videocodec% --audio-codec %audiocodec% --force-alt-h264 --load "%%f" --save "%%f.avi" --quit

(eğer AVIdemux sizde farklı bir klasörde kuruluysa "C:\Program Files\Avidemux 2.5\avidemux2.exe" satırını değiştirin) Bu metni yeni bir metin dosyası oluşturup içine kopyalayın. Sonra metin dosyasının ismini bir_sey.bat olarak değiştirin. Daha sonra bu dosyayı işleyeceğiniz videoların olduğu klasöre taşıyın. Son olarak bir_sey.bat dosyasına çift tıklayın. İşleme başlayacaktır.

Bash kabuğu kullanan Linux/Unix türevi sistemlerde benzer betik şöyle olacaktır

#!/bin/bash
VIDEOCODEC="Xvid"
AUDIOCODEC="MP3"
for FIL in `ls *mp4 | sort` ; do
  avidemux2 --video-codec $VIDEOCODEC --audio-codec $AUDIOCODEC --force-alt-h264 --load "$FIL" --save ${FIL%.*}.avi --quit
done

(bu komutlar sonucunda bir_sey.mp4 dosyasından bir_sey.avi dosyası oluşacaktır.)

Win32'de ses ve video için belirli bir bit oranını zorlamak istiyorsanız aşağıdakileri yapın

set avidemux="C:\softa\avidemux_r6854\avidemux2.exe"
set videocodec=Xvid
set videobitrate=cbr=512
set audiocodec=MP3
set audiobitrate=64
for %%f in (*.mp4) do %avidemux% --video-codec %videocodec% --video-conf %videobitrate% --audio-codec %audiocodec% --audio-bitrate %audiobitrate% --force-alt-h264 --load "%%f" --save "%%f.avi" --quit

Bash kabuğu kullanan Linux/Unix türevi sistemlerde benzer betik şöyle olacaktır

#!/bin/bash
VAR="batchfiles.txt"
VIDEOCODEC="Xvid"
AUDIOCODEC="MP3"
VIDEOBITRATE="cbr=512"
AUDIOBITRATE="64"
for FIL in `ls *mp4 | sort` ; do
  avidemux2 --video-codec $VIDEOCODEC --video-conf $VIDEOBITRATE --audio-codec $AUDIOCODEC --audio-bitrate $AUDIOBITRATE --force-alt-h264 --load "$FIL" --save ${FIL%.*}.avi --quit
done

(bu komutlar sonucunda bir_sey.mp4 dosyasından bir_sey.avi dosyası oluşacaktır.)

Sadece JS betiği (ECMAScript) ile toplu işleme

[değiştir]

AVIdemux JS betiğini (ECMAScript) betik yöntemini kullanarak da işinizi otomatikleştirebilirsiniz. Bu betikler komut satırından (--run) veya grafik arayüzden (File -> Load/Run project...) çalıştırılabilir. Arayüz bütün platformlarda aynı olduğu için betikler oldukça geneldir. Tek sorun teşkil edebilecek nokta slash işaretidir. Bazı işletim sistemleri klasör ayracı olarak / işaretini kullanırken bazı işletim sistemleri de \ işaretini kullanmakatdır.

JS betikleri (ECMAScript) aracılığıyla ek grafik arayüz elemanları (dosya ve klasör seçim diyalogları) kullanılabildiği için yeni kullanıcıların rahatlıkla kullanabileceği betikler yazılabilir.

İlk yazacağımız betik bir_sey.js olacak. Bu betiği çalıştırdığınızda önce girdi klasörü ve dosya tipini (ilk diyalog), ardından çıktı klasörü ve dosya ismini soracak (ikinci diyalog). Betik girdi klasöründeki belirtilen türdeki bütün dosyaları alacak ve bu dosyaları XviD+MP3 AVI olarak çıktı klasörüne kopyalayacak.

//AD  <-
/*
  orgDir klasörünü tarayacak
  sonra bütün .xyz dosyalarını açacak, daha sonra bunları Xvid+MP3 AVI olarak kodlayacak
  Sonuç dosyalar destDir klasörüne koyulacak
 
  Using new directorySearch API
*/
var app = new Avidemux();
var ds = new DirectorySearch();
var srcDir;
var dstDir;
var reg = new RegExp(".$");
var extReg = new RegExp(".*[.](.+)$"); 
 
//bu WINDOWS için klasör ayracı! *nix için bu sep = "/"; olmalı
var sep = "\\";
var fileExt;
var pickedExt;
var dstPath;
 
var filesDone = 0;
var filesSkip = 0;
var filesErrd = 0;
 
displayInfo("Kaynak klasörde bir dosya seçin. Seçtiğiniz dosyanın türündeki (.xyz) bütün dosyalar işlenecektir. Dosya ismi ihmal edilecek ama dosya uzantısı kullanılacaktır! \r\n\r\nörneğin AVI'leri işlemek istiyorsanız bir .avi dosyası seçtiğinizden emin olun!");
 
//Kaynak dosyayı seçmenizi isteyen bir diyalog açar. Dosya ismini silecek, sadece klasörü bırakacağız
srcDir = fileReadSelect();
 
//extReg düzenli ifadesini kullanarak sadece dosyanın uzantısını alıyoruz
pickedExt = srcDir.replace(extReg, "$1").toLowerCase();
 
displayInfo(pickedExt + "Hedef klasörü seçin ve rastgele bir dosya ismi girin. Dosya ismi ihmal edilecektir");
 
//Hedef klasörü seçmenizi isteyen bir diyalog açar. Dosya ismini silecek, sadece klasörü bırakacağız 
dstDir = fileWriteSelect();
 
//her seçili dosyanın sadece yol kısmını alıyoruz
srcDir = pathOnly(srcDir);
dstDir = pathOnly(dstDir);
 
//eğer yol klasör ayracı karakteri ile bitiyorsa bu karakteri sil
//bu normal şartlar altında birden fazla çalışmaz, ancak bir while döngüsü bunu yapabilir
//böylelikle c:\temp\\\\ kodunu sonundaki \ lar silinerek c:\temp yapılabilir
while(srcDir.charAt(srcDir.length-1) == sep){
  srcDir=srcDir.replace(reg,"");
}
while(dstDir.charAt(dstDir.length-1) == sep){
  dstDir=dstDir.replace(reg,"");
}
 
//directory search'e klasörü vererek ilklendir
if(ds.Init(srcDir))
{
  //klasördeki dosya listesinin sonuna erişene kadar
  // --> her ds.NextFile() çağrısı aktif bir sonraki dosyaya geçilmesini sağlar
  // --> döngü ds.NextFIle() false döndürene kadar devam eder (bu, dosya listesinin bittiği anlamına gelir)
  while(ds.NextFile())
  {
    //dosya ismini al (yol yok)
    dstPath=ds.GetFileName();
 
    //yalnızca klasör olmayan geçerli dosyaları işle
    if(!ds.isNotFile && !ds.isDirectory && !ds.isSingleDot && !ds.isDoubleDot)
    {
      //şimdi de uzantıyı alıyoruz
      ext=ds.GetExtension();
 
      //bu dosyanın uzantısı seçtiğimizle aynı mı?
      if(ext.toLowerCase() == pickedExt)
      {
        //çıktı dosya ismini oluştur. Kaynak dosyanın üzerine yazmayı engellemek için, klasör aynı a _ önekiyse        
        if(srcDir.toLowerCase() == dstDir.toLowerCase()){
          dstPath = dstDir + sep + "_" + ds.GetFileName() + ".avi";
        }else{
          dstPath = dstDir + sep + ds.GetFileName() + ".avi";
        }
 
        //kaynak dosya yolunu oluştur
        srcPath = srcDir + sep + ds.GetFileName();
 
        //öncelikle bu seçeneği ayarlıyoruz. Avidemux'un unpacking/time mapping işlemlerini yapmaya gerek görme ihtimaline karşı
        //bu seçeneği ayarlayarak dosyayı açtığımızda bu işlemin yapıldığına emin oluyoruz
        app.forceUnpack();
 
        //dosyayı aç. bu işlem ayrıca bütün video filtrelerini ve kodek ayarlarını temizler
        app.load(srcPath);
 
        //sesin VBR olup olmadığına bak. VBR'sa zaman haritası inşa et. VBR değilse hiçbir şey yapma
        app.audio.scanVbr();
 
        //eğer forceUnpack belirtilmişse bu gerekli olmayabilir. Yapılabileceğini düşünmüyorum
        //ancak ek olarak burada tekrar etmek güvenli
        app.rebuildIndex();
 
        //bu bölümdeki bütün kodlar app tarafından oluşturulmuştur. eğer bir betik yazmak ve filtreler kullanmak istiyorsanız
        //zor işi yapmak için app'ı edinebilirsiniz; şöyle:
        // betik yazacağınız dosyalardan birini açın
        // istediğiniz bütün video ve ses seçeneklerini ayarlayın
        // file menüsünde "Save Project as"i seçin (not: avi dosyasını kaydetmeyin!!)
        //kaydettiğiniz iş dosyası filtreler hakkında bilgi veren bir bölüm içerecektir. burayı kopyalayın
 
        //xvid 2 pass'e yeniden kodlayın, bit oranı = 1000 (ayrıca ses için 128 = 1128 kbps, saat başına 507.6 mega)
        //tüm seçenekler basite ayarlanmıştır, GMC yok, Qpel yok, vb. bu sayede bağımsız basit oynatıcılar tamamdır
       app.video.codecPlugin("92B544BE-59A3-4720-86F0-6AD5A2526FD2", "Xvid", "2PASSBITRATE=1000", "<?xml version='1.0'?><XvidConfig><XvidOptions><threads>0</threads><vui><sarAsInput>false</sarAsInput><sarHeight>1</sarHeight><sarWidth>1</sarWidth></vui><motionEstimation>high</motionEstimation><rdo>dct</rdo><bFrameRdo>false</bFrameRdo><chromaMotionEstimation>true</chromaMotionEstimation><qPel>false</qPel><gmc>false</gmc><turboMode>false</turboMode><chromaOptimiser>false</chromaOptimiser><fourMv>false</fourMv><cartoon>false</cartoon><greyscale>false</greyscale><interlaced>none</interlaced><frameDropRatio>0</frameDropRatio><maxIframeInterval>300</maxIframeInterval><maxBframes>2</maxBframes><bFrameSensitivity>0</bFrameSensitivity><closedGop>false</closedGop><packed>false</packed><quantImin>1</quantImin><quantPmin>1</quantPmin><quantBmin>1</quantBmin><quantImax>31</quantImax><quantPmax>31</quantPmax><quantBmax>31</quantBmax><quantBratio>150</quantBratio><quantBoffset>100</quantBoffset><quantType>h.263</quantType><intraMatrix><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value></intraMatrix><interMatrix><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value></interMatrix><trellis>true</trellis><singlePass><reactionDelayFactor>16</reactionDelayFactor><averagingQuantiserPeriod>100</averagingQuantiserPeriod><smoother>100</smoother></singlePass><twoPass><keyFrameBoost>10</keyFrameBoost><maxKeyFrameReduceBitrate>20</maxKeyFrameReduceBitrate><keyFrameBitrateThreshold>1</keyFrameBitrateThreshold><overflowControlStrength>5</overflowControlStrength><maxOverflowImprovement>5</maxOverflowImprovement><maxOverflowDegradation>5</maxOverflowDegradation><aboveAverageCurveCompression>0</aboveAverageCurveCompression><belowAverageCurveCompression>0</belowAverageCurveCompression><vbvBufferSize>0</vbvBufferSize><maxVbvBitrate>0</maxVbvBitrate><vbvPeakBitrate>0</vbvPeakBitrate></twoPass></XvidOptions></XvidConfig>");

	app.audio.reset();
	app.audio.codec("Lame",128,20,"80 00 00 00 00 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 ");
	app.audio.normalizeMode=0;
	app.audio.normalizeValue=0;
       app.audio.delay=0;
       app.audio.mixer="STEREO";
 
       app.setContainer("AVI");
 
        //bu dosyayı yaz
        app.save(dstPath);
 
      } else{ //bu dosyayı işlememeye karar veriyoruz
        //neden klasörün içindeki tüm dosyaların işlenmediğini merak etme ihtimalinize karşı bazı tanısal bilgiler
        whyNot = dstPath + " işlenmedi çünkü: ";
        if(ds.isNotFile)
          whyNot += "bir dosya değil, ";
        if(ds.isDirectory)
          whyNot += "bir klasör, ";
        if(ds.isHidden)
          whyNot += "gizli, ";
        if(ds.isArchive)
          whyNot += "arşiv olarak işaretlenmiş, ";
        if(ds.isSingleDot)
          whyNot += "geçerli klasör (.) için bir meta-ref, ";
        if(ds.isDoubleDot)
          whyNot += "üst klasör (..) için bir a meta-ref, ";
 
        //şimdi sebep ne?  
        print(whyNot);
      }
    }
  }
  ds.Close();
}

Betikleri kolayca kendi başınıza oluşturabilirsiniz. Gerekli ayarları grafik arayüz aracılığıyla uygulayabilir ve sonra bütün ayarları içeren metin dosyasını oluşturmak için File -> Save Project As... yolunu izleyebilirsiniz. Sonra bu dosyayı metin editörünüzle açabilir ve gerekli kısımları yeni betiğe kopyala+yapıştır yoluyla aktarabilirsiniz (veya diğer betikteki bazı kısımların yerine koyabilirsiniz).

Komut satırı ve JS betiğinin birleşimi

[değiştir]

Son seçenek her iki dünyanın en iyi kısımlarını birleştirmektir. Genellikle bunun için en iyi durum bütün dosyalar için çalıştıracağınız otomatikleştirilmiş betiği oluşturmaktır (diyalog yok).

Aşağıda kısa bir Win32 örneği bulunmaktadır, önce betik (tekrar bir_sey.js olarak kaydedin)

//AD  <- Tanımlamak için gerekli//
var app = new Avidemux();
// '''Postproc'''
app.video.setPostProc(3,3,0);

//''' Filtreler '''

//''' Video Kodek yapılandırması'''
app.video.codecPlugin("92B544BE-59A3-4720-86F0-6AD5A2526FD2", "Xvid", "2PASSBITRATE=1000", "<?xml version='1.0'?><XvidConfig><XvidOptions><threads>0</threads><vui><sarAsInput>false</sarAsInput><sarHeight>1</sarHeight><sarWidth>1</sarWidth></vui><motionEstimation>high</motionEstimation><rdo>dct</rdo><bFrameRdo>false</bFrameRdo><chromaMotionEstimation>true</chromaMotionEstimation><qPel>false</qPel><gmc>false</gmc><turboMode>false</turboMode><chromaOptimiser>false</chromaOptimiser><fourMv>false</fourMv><cartoon>false</cartoon><greyscale>false</greyscale><interlaced>none</interlaced><frameDropRatio>0</frameDropRatio><maxIframeInterval>300</maxIframeInterval><maxBframes>2</maxBframes><bFrameSensitivity>0</bFrameSensitivity><closedGop>false</closedGop><packed>false</packed><quantImin>1</quantImin><quantPmin>1</quantPmin><quantBmin>1</quantBmin><quantImax>31</quantImax><quantPmax>31</quantPmax><quantBmax>31</quantBmax><quantBratio>150</quantBratio><quantBoffset>100</quantBoffset><quantType>h.263</quantType><intraMatrix><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value></intraMatrix><interMatrix><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value><value>1</value></interMatrix><trellis>true</trellis><singlePass><reactionDelayFactor>16</reactionDelayFactor><averagingQuantiserPeriod>100</averagingQuantiserPeriod><smoother>100</smoother></singlePass><twoPass><keyFrameBoost>10</keyFrameBoost><maxKeyFrameReduceBitrate>20</maxKeyFrameReduceBitrate><keyFrameBitrateThreshold>1</keyFrameBitrateThreshold><overflowControlStrength>5</overflowControlStrength><maxOverflowImprovement>5</maxOverflowImprovement><maxOverflowDegradation>5</maxOverflowDegradation><aboveAverageCurveCompression>0</aboveAverageCurveCompression><belowAverageCurveCompression>0</belowAverageCurveCompression><vbvBufferSize>0</vbvBufferSize><maxVbvBitrate>0</maxVbvBitrate><vbvPeakBitrate>0</vbvPeakBitrate></twoPass></XvidOptions></XvidConfig>");

//''' Ses '''
app.audio.reset();
app.audio.codec("Lame",128,20,"80 00 00 00 00 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 ");
app.audio.normalizeMode=0;
app.audio.normalizeValue=0;
app.audio.delay=0;
app.audio.mixer="STEREO";
app.setContainer("AVI");
setSuccess(1);
//app.Exit();

//Betiğin sonu

Win32 örneği (.bat dosyası) aktif klasördeki bütün .mp4 dosyalarını .avi'ye (XviD+MP3) dönüştürecektir. Asıl dosyalar değiştirilmeyecek ve yeni dosyalar bir_sey.mp4.avi formatıyla isimlendirilecektir.

set avidemux="C:\Program Files\Avidemux 2.5\avidemux2.exe"
for %%f in (*.mp4) do %avidemux% --force-alt-h264 --load "%%f" --run something.js --save "%%f.avi" --quit

Bash kabuğu kullanan Linux/Unix türevi sistemlerde benzer betik şöyle olacaktır

#!/bin/bash
for FIL in `ls *mp4 | sort` ; do
  avidemux2 --force-alt-h264 --load "$FIL" --run something.js --save ${FIL%.*}.avi --quit
done

(bu kodlar bir_sey.mp4 dosyasından bir_sey.avi dosyası oluşturacaktır)

Kendi birleşik toplu ayarlarınızı oluştururken, komut satırı parametrelerinin sırasının her zaman --load bir_sey, --run bir_sey ve --save bir_sey şeklinde olmasına özen gösterin (AVIdemux bu seçenekleri verilen sırada çalıştıracaktır).

İpuçları

[değiştir]
  • Dosyaları grafik arayüz olmadan işlemek istiyorsanız avidemux2'yi avidemux2_cli'yle değiştirebilirsiniz
  • Bütün diyalogları bloke etmek istiyorsanız --nogui seçeneğini kullanabilirsiniz (ilk seçenek olmalıdır!)