Önemli! iOS 8'den itibaren VTCompressionSession'ı kullanabilir ve kapsayıcıyı kazmak yerine NAL birimlerine doğrudan erişebilirsiniz.
Eh şans bunu yapabilirsiniz ve nasıl anlatacağım, ancak MP4 veya MOV konteyner ya kirli ellerini almak zorunda gidiyoruz. Bu (gerçi daha MOV özel) için yararlı bir kaynak Apple'ın Quicktime Dosya Formatı olan giriş manuel http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFPreface/qtffPreface.html#//apple_ref/doc/uid/TP40000939-CH202-TPXREF101
ilk şey ilk, 30 saniye önce keyfi bir noktadan kaydedilen filmi başlatmak mümkün olacak değiliz Kaydın sonunda, yaklaşık 30 saniyede bazı I-Frame kullanmanız gerekecek. Keyframe Aralığınızın ne olduğuna bağlı olarak, bu 30 saniyelik işaretten birkaç saniye önce veya sonra olabilir. Tüm I-kareleri kullanabilir ve keyfi bir noktadan başlayabilirsiniz, ancak sonra muhtemelen videoyu daha sonra yeniden kodlamak isteyeceksiniz çünkü bu oldukça büyük olacaktır. SO bilerek
, devam edelim.
İlk adım, AVAssetWriter'ınızı ayarladığınızda, AVAssetWriterInput'ın beklentileriniMediaDataInRealTime özelliğini YES olarak ayarlamak isteyeceksiniz. Eğer yazıyoruz dosyadan bir fread yapmak mümkün olacak captureOutput Geri arama durumunda
. İlk yayın size biraz MP4/MOV (kullandığınız herhangi bir format) başlığı (yani 'ftyp' atomu, 'geniş' atom ve 'mdat' atomunun başlangıcı) getirecektir. 'Mdat' bölümünün içinde ne istiyorsun. Dolayısıyla, verileri kaydetmeye başlayacağınız ofset, 36 veya daha fazla olacak.
Her bir okuma size 0 veya daha fazla AVC NAL Birimi getirecektir. NAL birim tiplerinin listesini ISO/IEC 14496-10 Tablo 7-1'den bulabilirsiniz. Ek B'de belirtilenden biraz farklı bir formatta olacaklar, ama sorun değil. Ayrıca, sadece MP4/MOV dosyasında IDR dilimleri ve IDR olmayan dilimler olacaktır. IDR, asmak istediğin I-Frame olacak.
4 bytes - Size
[Size] bytes - NALU Data
data[0] & 0x1F - NALU Type
Demek artık aradığınız verilere sahip şöyledir: MP4/MOV kapta
NAL birimi biçimidir.Bu dosyayı kaydetmeye gittiğinizde, MPV/MOV kabını doğru uzunlukta, örnek sayımı ile güncellemeniz gerekir. 'Stsz' atomunu her bir örnek için doğru boyutlarla güncellemeniz gerekir. Medya üstbilgileri ve parça başlıkları ile filmin doğru süreleri vb. Yapmamızı önerdiğim şey, ilk çalıştırmada, belirli bir film için uygun verilerle daha fazla veya daha az yer kaplayabileceğiniz bir örnek kapsayıcı oluşturmaktır. Bunu yapmak isteyeceksiniz çünkü çeşitli iDevices üzerindeki kodlayıcıların hepsi aynı ayarlara sahip değildir ve 'avcC' atomu kodlayıcı bilgilerini içerir.
Bu durumda AVC akışı hakkında çok fazla bilgi sahibi olmanıza gerek yok, bu nedenle muhtemelen denemenizi doğru şekilde seçtiğiniz kapsayıcı biçimini güncellemeye yoğunlaştırmak isteyeceksiniz. İyi şanslar.
Thx :) ancak sorun, kameradan bu tür bir arabelleğe nasıl veri yönlendirileceğidir. –
Adam - Bunu nasıl çözdüğünü hiç çözdün mü? – jangelo42
@AdamSzeptyck: Yukarıda elde etmek istediklerinize benzer bir şey deniyordum. Eğer çözebilirseniz, bunu nasıl yapabileceğinizi bize bildirir misiniz? –