2015-05-15 4 views
1

Я пытаюсь записывать видео, используя библиотеку GPUImage. Записанный клип заканчивается черной рамкой. Я знаю, что это вызвано audioEncodingTarget, что является очень дорогостоящей операцией. Это обсуждалось много, но я до сих пор не нашел решения. Вот мой код:GPUImageMovieWriter - черная рамка, вызванная audioEncodingTarget

класс GPUCameraRecorder INIT

videoCamera = GPUImageVideoCamera(sessionPreset: AVCaptureSessionPresetiFrame960x540, cameraPosition: .Back) 
    videoCamera.outputImageOrientation = .LandscapeRight; 
    videoCamera.horizontallyMirrorFrontFacingCamera = true 

    filter = GPUImageFilter() 
    videoCamera.addTarget(filter) 

    view = GPUImageView(frame: frame) 
    view.fillMode = kGPUImageFillModePreserveAspectRatioAndFill 

    movieWriter = GPUImageMovieWriter(movieURL: output, size: view.frame.size) 
    movieWriter?.encodingLiveVideo = true 

    filter?.addTarget(movieWriter!) 
    filter?.addTarget(view as GPUImageView) 

    videoCamera.audioEncodingTarget = self.movieWriter! 
    videoCamera.startCameraCapture() 

функция записи старта

func startRecording(){ 
    println("Start recording.") 
    recording = true 

    dispatch_async(dispatch_get_main_queue()) { 
     var res = self.videoCamera.addAudioInputsAndOutputs() 
     println(res) 

     self.movieWriter!.startRecording()    
    } 
} 

функция конца записи

func stopRecording(){ 
    println("Recording end.") 

    dispatch_async(dispatch_get_main_queue()) {    
     self.filter?.removeTarget(self.movieWriter!) 
     self.videoCamera.audioEncodingTarget = nil 
     self.movieWriter!.finishRecording() 

     self.putTorchOff() 
     self.delegate?.recordingEnd() 

     println("completed") 
    } 
} 

Любое предложение? Кто-то нашел способ заставить его работать без черных кадров?

ответ

3

Вы попробовали?

Внутри GPUImageMovieWriter.m код добавить:

static BOOL allowWriteAudio = NO; 

- (void)startRecording; 
{ 
    ... 
    allowWriteAudio = NO; 
} 

- (void)processAudioBuffer:(CMSampleBufferRef)audioBuffer; 
{ 
    if (!allowWriteAudio) { 
    return; 
    } 
    ... 
} 

- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; 
{ 
    ... 
    if (![assetWriterPixelBufferInput appendPixelBuffer:pixel_buffer withPresentationTime:frameTime]) 
    NSLog(@"Problem appending pixel buffer at time: %@", CFBridgingRelease(CMTimeCopyDescription(kCFAllocatorDefault, frameTime))); 

    allowWriteAudio = YES; //< add this 
    ... 
} 

https://github.com/BradLarson/GPUImage/issues/1255

+0

Тем не менее я получаю, что черная рамка –

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