Avidemux/B-frame'ler
Bu sayfa B-frame işlemeye giriş niteliğindedir. B-frame'lere aşinaysanız bu sayfayı atlayabilirsiniz.
Video frame'leri 3 türe ayrılabilir:
- I-Frame: Intra frame veya keyframe olarak da bilinirler; referans frame'leri yoktur ve tek başlarına çözülürler; JPEG resimleri gibi düşünülebilirler.
- P-Frame: Predicted frame'in (tahmin edilen frame) kısaltılmışıdır. Dosyada tam anlamıyla saklı değildirler. Çözülme işlemi esnasında kendinden hemen önce gelen frame'e (I veya P) göre inşa edilirler; çözülmesi için öncelikle kendinden önceki frame'in çözülmüş olması gerekir.
- B-Frame: Kendinden önceki ve sonraki frame'lere (I-P) göre inşa edilirler. Başka frame'ler için referans frame'i olamazlar.
B-frame'ler iki bakımdan ilginçtir. İlk olarak biraz daha iyi tahmine sahiptirler. İkinci ve önemli olan ise -referans frame'i olamadıkları için- kendinden sonra gelen frame'lerin kalitesini etkilemezler, bu sayede diğer frame'leri etkilemeden düşük kaliteyle kodlanabilirler.
B-frame'ler hem önceki, hem de sonraki resme bağlı olduklarından, çözücünün çözme işlemine başlaması için ilgili frame'den sonraki frame'i de (I-P) bilmesi gerekir. Bu noktada PTS/DTS sistemi devreye girer.
Presentation Time Stamp (PTS - Görüntülenme Zamanı Damgası) görüntülenme zamanıyla ilgilenir, her bir frame'in tam olarak kaçıncı sırada gösterileceği bilgisini PTS tutar. Decoder Time Stamp (DTS - Çözülme Zamanı Damgası) ise frame'lerin çözülme zamanıyla ilgilenir.
Şöyle kısa bir videoya sahip olduğumuzu varsayalım:
I-0 B-1 B-2 P-3
Buradaki harfler normal frame'leri, sayılar ise PTS'in tuttuğu gösterim zamanı damgalarını temsil ediyor. Buradaki B-1 ve B-2 hem I-0'a hem de P-3'e bağlıdır (bir B-frame başka bir frame'in referans frame'i olamaz). Bu videonun DTS sırası şöyledir:
I-0 P-3 B-1 B-2
Yani daha önce çözülmesi gereken frame'ler daha öne getiriliyor. Dosyalar PTS sırasıyla değil DTS sırasıyla kodlanır.
İşte burada aklımıza bir soru takılıyor. Frame'ler DTS sırasıyla kodlandığına göre çözücü frame'leri nasıl düzgün sırada gösterecek? Normalde içinde B-frame olmayan videoları açmak kolaydır. Çözücü bir frame'i alır, aldığı frame bir P-frame ise önceki frame'den inşa eder, sonra bu frame'i çıktıya verir. Halbuki içinde B-frame olan dosyalarda çözücü aldığı her frame'i direkt olarak çıktıya vermeye kalksa frame'ler DTS sırasıyla (PTS sırasıyla değil) gösterileceği için frame'ler yanlış sırayla gösterilecektir. Bu sorunu çözmenin iki farklı yöntemi vardır:
1. MPEG yöntemi
Bu yöntemde yapılan şey gösterilen (çıktı) frame'lerin 3 frame miktarında geciktirilmesidir. Şimdi bu durumu hayalimizde canlandıralım:
Çözülen frame: 0 3 1 2 - - -
Gösterilen frame: - - - 0 1 2 3
Burada ilk üç frame okunur ama çözücü herhangi bir çıktı vermez. Dördüncü frame'i okuduğunda birinci sırada gösterilmesi gereken frame'i gösterir. Bütün frame'ler bu mantıkla çözülüp gösterilirken çözücünün elinde daima ilgili zamanda gösterilecek frame çözülmüş halde hazır bulunacağından frame'ler düzgün sırada gösterilir. Çözücü hangi frame'in hangi sırada gösterileceğini ilgili frame'in PTS damgasından anlar.
2. DivX yöntemi
Az önceki akımları anlamayan uygulamalarla PTS/DTS'i kullanmak için DivX kodeki (ve uyumluluk modunda Xvid) farklı bir hile kullanır.
Bu yöntemde PB frame'lerin biraz değişiği kullanılır ve birden fazla frame tek bir frame olarak paketlenir. Uygulama paketlenmiş frame'leri tek bir frame olarak görür. Uygulamanın böyle görmesini kodek sağlar.
Az önceki örneği göz önüne alırsak DivX şöyle bir dosya üretir, () arasındaki frame'leri uygulama tek bir frame olarak görür:
Çözülen frame: (0 3 1 2) - - -
Gösterilen frame: 0 1 2 3
Paketlenen frame'lerin yerlerine null frame'ler konur. Kodek, paketlenmiş bir frame'den sonra null frame geldiğini görürse o paketteki frame'leri çıkaracağını anlayacaktır.
Olaya programcı gözüyle bakacak olursak giriş ve çıkış arasında bir gecikme olmaması ve AVI dosyalarının, çözücüyü/oynatıcıyı özel durum hakkında bilgilendirmek için PTS/DTS bileşenlerine sahip olmaması ilginçtir. İlk yöntemin aksine, ikinci yöntemde çözücünün hiçbir rolü yoktur, bütün işi kodek yapar.
Her iki yöntem Avidemux'un frame doğruluğu ilkesine terstir. MPEG yönteminde giren ve çıkan frame'ler arasında gecikme vardır. Bu Avidemux kullanıcısı için kabul edilemezdir. Çünkü Avidemux kullanıcısı tam olarak hangi frame'i işlediğini bilmelidir. DivX/Xvid yönteminde ise 2, 3, 4. frame'ler aslında null olmadığı halde null gibi gözükmektedir. Bu da Avidemux'un frame doğruluğu ilkesine terstir.
Neyse ki Avidemux PTS/DTS sistemiyle tek başına baş eder, ve kodekten frame'leri direkt olarak çıkarmasını zorlar. Avidemux'un editör kısmı frame'lerin DTS/PTS sırasını bilir ve çözücüye doğru frame'leri getirir. Avidemux sayesinde B-frame'leri kendi konumunda görürsünüz.
DivX ve Xvid frame'leri paketleyerek frame'lerin türünün gözükmesini engellerler. Avidemux 2.0.24 ve daha üstü sürümlerinde bu sorunu yükleme esnasında paketlenmiş akımı açarak çözer. Ancak bu durum yalnızca AVI/OpenDML için geçerlidir, eğer kaynak OGM ise önce OGM'yi AVI olarak kaydedip sonra bu AVI'yi açın.
Ayrıca bakınız
[değiştir]I-frame'ler - I-frame'ler ve dijital video dünyasında rolleri.