2012-08-05 20 views
15

Sadece son birkaç dakikayı/saniyeyi kaydetmek için kamerayı kullanacak bir iPhone uygulaması geliştirmeye çalışıyorum. Örneğin, 5 dakika boyunca bir film kaydederseniz, "kaydet" i tıkladığınızda sadece son 30'lar kaydedilir. Aslında beş dakika kayıt yapmak istemiyorum ve son 30'ları doğramak istemiyorum (bu benim için işe yaramaz). Bu fikir "Loop recording" olarak adlandırılır.ios sonsuz video kaydı

Bu sonsuz bir video kaydının sonuçlanır, ancak sadece son kısmını hatırlıyorum. Precorder uygulaması yapmak istediğimi yapın. (Bu özelliği başka bir bağlamda kullanmak istiyorum) Bunun bir Circular buffer ile kolayca simüle edilmesi gerektiğini düşünüyorum. AVFoundation ile bir projeye başladım. Bir şekilde video verilerini dairesel bir tampona (eğer uygulayacağım) yeniden yönlendirirsem harika olurdu. Sadece bir dosyaya nasıl yazılacağı hakkında bilgi buldum.

Ben aralıklarla içine videoyu doğrayın ve bunları kaydedebilirsiniz biliyorum ama kaydedip başka bölümünü kaydetmek için kamerayı yeniden başlatmadan zaman alacak ve onu filmde bazı önemli anları kaybetmek mümkündür. kameradan veri aktarımı nasıl

Herhangi ipuçları mutluluk duyacağız.

+0

Thx :) ancak sorun, kameradan bu tür bir arabelleğe nasıl veri yönlendirileceğidir. –

+0

Adam - Bunu nasıl çözdüğünü hiç çözdün mü? – jangelo42

+0

@AdamSzeptyck: Yukarıda elde etmek istediklerinize benzer bir şey deniyordum. Eğer çözebilirseniz, bunu nasıl yapabileceğinizi bize bildirir misiniz? –

cevap

10

Ö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.

+0

Büyük Cevap, bunun için bazı demo kodu sağlayabilir misiniz. Çok yardımcı olacak. –

+2

https://github.com/jgh-/VideoCore/blob/master/transforms/Apple/H264Encode.mm, "VTCompressionSession" uygulamasının bir uygulamasını gösterir. 'H264Encode :: compressionSessionOutput' kodundaki bu kod örneğindeki gibi NAL ünitelerini boruya itmek yerine, 30 saniye veya daha fazla depolama için bir halka tampona yerleştirebilirsiniz. – jgh

+0

Harika!, Link paylaştığınız için teşekkürler =) –