2015-11-18 23 views
5

Bir AVCaptureSession almaya çalışıyorum ve mp4'e kodlarım. Bunun açık olması gerektiği gibi görünüyor ve tek bir 960x540 video akışını kodlamaya çalışıyorum; Bu konuda ses konusunda endişelenmiyorum.AVAssetWriterInput - siyah ekran, 46 saat uzunluğunda

Aşağıdaki kodu çalıştırdığımda ve Xcode ile belge kapsayıcısından out2.mp4 kaptığımda, hızlı bir şekilde siyah bir ekran alıyorum ve süre 46 saat sürüyor. En azından çözünürlük doğru görünüyor. İşte ffmpeg -i out2.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out2.mp4': 
    Metadata: 
    major_brand  : mp42 
    minor_version : 1 
    compatible_brands: mp41mp42isom 
    creation_time : 2015-11-18 01:25:55 
    Duration: 46:43:04.21, start: 168178.671667, bitrate: 0 kb/s 
    Stream #0:0(und): Video: h264 (High) (avc1/0x31637661), yuv420p(tv, smpte170m/bt709/bt709), 960x540, 1860 kb/s, 27.65 fps, 29.97 tbr, 600 tbn, 1200 tbc (default) 
    Metadata: 
     creation_time : 2015-11-18 01:25:55 
     handler_name : Core Media Video 

Neden bu senaryoda AVAssetWriterInput örnek tampon ekleme olamaz çıktısı var?

var videoInput: AVAssetWriterInput? 
var assetWriter: AVAssetWriter? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.startStream() 
    NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: "swapSegment", userInfo: nil, repeats: false) 
} 

func swapSegment() { 
    assetWriter?.finishWritingWithCompletionHandler(){ 
     print("File written") 
    } 
    videoInput = nil 
} 

func pathForOutput() -> String { 
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    if let documentDirectory: NSURL = urls.first { 
     let fileUrl = documentDirectory.URLByAppendingPathComponent("out1.mp4") 
     return fileUrl.path! 
    } 
    return "" 
} 

func startStream() { 
    assetWriter = try! AVAssetWriter(URL: NSURL(fileURLWithPath: self.pathForOutput()), fileType: AVFileTypeMPEG4) 

    let videoSettings: [String: AnyObject] = [AVVideoCodecKey: AVVideoCodecH264, AVVideoWidthKey: 960, AVVideoHeightKey: 540] 
    videoInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoSettings) 
    videoInput!.expectsMediaDataInRealTime = true 
    assetWriter?.addInput(videoInput!) 
    assetWriter!.startWriting() 
    assetWriter!.startSessionAtSourceTime(kCMTimeZero) 

    let videoHelper = VideoHelper() 
    videoHelper.delegate = self 
    videoHelper.startSession() 
} 

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBufferRef, fromConnection connection: AVCaptureConnection!) { 
    if let videoOutput = captureOutput as? AVCaptureVideoDataOutput { 
     videoInput?.appendSampleBuffer(sampleBuffer) 
    } 
} 

cevap

4

Belki sunum saatlerinde sourceTime (kCMTimeZero) göreli değildir. İlk arabellek sunumu zaman damgasını kaynak zamanı olarak kullanabilirsiniz.

p.s. belki, 46hrs, cihazınızın uptime süresi dır yaklaşık

+0

Bunu nasıl yaparım? –

+0

Eğer "! SessionStarted { sessionStarted = true assetWriter! .startSessionAtSourceTime (CMSampleBufferGetPresentationTimeStamp (sampleBuffer)) }' ile bir süre olsa bile, 46 saat süre alırım. –

+0

Boşver, işe yarıyor! Yazmaya çalışırken yazdığınız dosyayı sildiğinizden emin olun. –

İlgili konular