Ağu
4
2012

MP4, H264, AAC nedir ve MP4 dosya formatı

Şimdiye kadar hep kulaktan dolma bilgiler ile mp4, h264, aac vb. terimleri hakkında bir şey öğrendim. Mesela bir filmi izlerken eğer medya oynatıcısı dosyayı açamıyorsa kodek eksiktir deyip internetten bulduğum birkaç kodek ile dosyanın açılmasını sağladım. Aslına bakarsınız kodek nedir dosya formatı nedir bunlar hakkında bilgim yok sayılırdı ta ki mp4 dosya yapısı ve kodekler ile ilgili bir şeyler yapmam gerekene kadar.

Mesela önceden mp4’ü bir tür kodek olarak düşünürdüm aslında üzerinde pek de düşündüm sayılmaz ama sonradan öğrendim ki mp4 sayısal ses ve görüntü çerçevelerini uygun bir yapı içerisinde tutan standart(ISO/IEC 14496-14) bir dosya biçimiymiş. H264 veya AVC(Advanced Video Coding) ise yüksek kalitede videoları sıkıştırmak, kayıt etmek için kullanılan bir video sıkıştırma standartıymış yani sözü çokça geçen kodekmiş. AAC(Advanced Audio Coding)
de tahmin edeceğiniz gibi ses sıkıştırma kodeğiymiş.

Teorik olarak mp4 dosya formatı içerisine istenilen H264 veya AAC dışında farklı kodekler(MP3, ALS, MP1, MP2 veya H263 ) yerleştirilebilir ama pratikte MP4 dosyası içerisinde en çok desteklenen H264 ve AAC kodekleridir. Bu aşamada benim aklıma şu geliyor: MP3’ü bir tür ses sıkıştırma kodeği olarak biliyorken MP4 neden kodekleri içerisinde tutabilen bir dosya biçimi? Burada bir tutarsızlık yok mu diye düşünüyorum. Sonradan yine anlıyorum ki aslında MP4 ile kast edilen şey MPEG-4 Part 14 standartı ve bu standarttın bir önceki sürümü de tahmin edeceğiniz gibi MPEG-3 ve bu standart da yine ses ve görüntü çerçevelerini içinde tutabilen bir dosya biçimi. MP3 de – tekrar olacak ama – piyasa da çokça kullanılan bir tür ses sıkıştırma kodeği.

Bir de farklı bir açıdan olaya bakalım mesela FLV biçimi aynı MP4 gibi bir dosya biçimi ve FLV içerisine H264 ve AAC kodekleri yerleştirilebiliyor. Yani kodekler aynı olduktan sonra bir MP4 dosyası ile bir FLV dosyası aynı kalitede ses ve görüntü içerebiliyor.

MP4 dosyası ve FLV dosyası aynı ses ve görüntü çerçevelerini barındırabiliyor ama dosya biçimleri incelendiğinde, biraz uğraştıktan sonra herkes ses ve görüntü çerçevelerini uygun biçimde birleştirip FLV biçiminde bir dosya oluşturabilecekken aynı şeyi MP4 dosyasında yapması o kadar kolay gözükmüyor. En azından bana öyle geliyor.

Şimdi MP4′un birazcık iç derinliklerine inelim. MP4 dosyası ses ve görüntü çerçeveleri hakkında bilgi veren kutucuklardan oluşur. Bunlara box veya atom denir. Mesela bir atom(mdat) ses ve görüntü çerçevelerinin ham bilgilerini içerirken başka bir atom(moov) kullanılan kodek bilgilerini, ses ve görüntü çerçevelerinin nerede bittiğini, ne kadar sürdüğünü, bir sonrakinin nerede başladığını içerir. Atomların genel yapısı ise şöyledir.

İlk 4 byte o atomun kaç byte uzunlukta olduğunu gösterir. İlk 4 bytetan sonra yine 4 byte uzunluğunda atomun adı (mdat, moov, trak, tkhd, mdia vb.) bulunuyor.Gerisinde de o atomun verileri yer alır.

Bir mp4 dosyasında ses ve görüntü iki ayrı track olarak değerlendilir. Daha doğrusu eğer bir mp4 dosyasında hem ses hem görüntü varsa iki tane track atomu vardır ve track atomları önceden konuştuğumuz gibi kodek ses ve görüntü veriler ile ilgili bilgi verir.

MP4 Parser

Bir MP4 dosyasının incelemek isterseniz mp4parser projesini kullanabilirsiniz. Tek tek tüm atomları ve çerçeveleri gösteren başarılı açık kaynak kodlu bir program.

MP4 dosyası internet üzerinden hemen çalmaya başlayabilir ama bir şartla!

MP4 dosyası internet üzerinden akabilen(streaming) bir yapıdadır ama aslına bakarsanız bunun da bir şartı var. Birkaç paragraf yukarıda bahsedildiği gibi moov atomu çerçevelerin nerede başladığını, nerede bittiğini içerir. Bir noktada MP4 dosyasının haritasıdır. MP4 oynatıcılar moov atomunu okumadan dosyayı çalamazlar. Sonuca gelirsek moov atomu bazen dosyanın başında değil sonunda olabiliyor. Bu durumda da eğer MP4 dosyası internet üzerinden çalınmak istiyorsa dosyanın tamamının indirilmesi gerekir. Bu yüzden MP4 dosyası internet üzerinden izlenecekse ve hemen çalmaya başlaması isteniyorsa moov atomunun dosyanın başında olması gerekir.

H264 ve AAC kodekli bir MP4 dosyasını parse etmek

MP4 dosyası moov atomuna bakmadan biraz uğraşarak görüntü çerçevelerine ayrılsa bile
AAC ses çerçevelerini ayırmak oldukça zordur. Daha doğrusu ben yapamadım. Görüntü ve
ses çerçevelerine ayırsanız bile kodekler, örnekleme vb. bilgiler için en azından aynı kalitede
çekilmiş başka bir MP4 videosuna bakıp gerekli parametreleri ondan almanız gerekir. Normal
şartlarda bir insanın MP4 dosyasını kendi başına parse etmesi gerekmez diye düşünüyorum.
Önceden yapılmış mp4parser ve ffmpeg tarzı kütüphanelerle bir mp4 dosyası üzerinde
ihtiyacınız olan tüm işlemleri yapabilirsiniz kanaatindeyim.

Ahmet Oğuz Mermerkaya

ahmetmermerkaya at gmail dot com

About the Author:

Leave a comment

Partners