2015-11-18 4 views
5

Я пытаюсь взять AVCaptureSession и закодировать mp4. Кажется, что это должно быть простым, и я пытаюсь кодировать один поток видео 960x540; Я не беспокоюсь об аудио для этой проблемы.AVAssetWriterInput - черный экран, 46 часов

Когда я запускаю следующий код и захватываю out2.mp4 из контейнера документов с Xcode, я получаю черный экран в кратчайшие сроки, а продолжительность составляет 46 часов. По крайней мере, разрешение выглядит правильно. Вот выход из 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 

Почему я не могу Append примеры буферов к AVAssetWriterInput в этом сценарии?

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) 
    } 
} 

ответ

4

Может быть, ваше время презентации не по отношению к вашему sourceTime (kCMTimeZero). Вы можете использовать первую временную метку представления буфера в качестве исходного времени.

p.s. возможно, 46 часов - это примерно время работы вашего устройства

+0

Как бы я это сделал? –

+0

Даже если с if '! SessionStarted { sessionStarted = true assetWriter! .startSessionAtSourceTime (CMSampleBufferGetPresentationTimeStamp (sampleBuffer)) }', я получаю продолжительность 46 часов. –

+0

Ничего, это работает! Обязательно удалите файл, который вы пишете, прежде чем пытаться его записать. –

Смежные вопросы