2017-04-10 1 views
2

프레임 :VTCompressionSession 먼저 스킵 I 다음 코드 스위프트 3에 VTCompressionSession로 인코딩있어

let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
let statusCode = VTCompressionSessionEncodeFrame(compressionSession!, pixelBuffer!, CMSampleBufferGetPresentationTimeStamp(sampleBuffer), CMSampleBufferGetDuration(sampleBuffer)/* CMTimeMake(counter, 1000), kCMTimeInvalid*/, nil, nil, nil) 
if statusCode != noErr { 
NSLog("VT Error!", statusCode) 
} 

pixelBuffer 변수가 출력 할 AVCaptureSession이다. 이 AVCaptureSession의 콜백은 위의 코드를 호출합니다. 문제는 위 코드가 n 번 호출되지만 VTCompressionSession의 콜백은 n-10 번만 호출되기 때문에 다른 프레임이 어디로 갈지 궁금합니다. 압축을 향상시키기 위해 큐에 저장되어 있습니까? 아니면이 문제가 있습니까? 최종 h264 스트림이 100 % 정확하지 않으며 이것이 문제의 원인인지 확실하지 않습니다.

VTCompressionSession는 다음 코드로 생성됩니다

var error = VTCompressionSessionCreate(kCFAllocatorDefault, 
              270, 
              480, 
              kCMVideoCodecType_H264, 
              nil, 
              nil, 
              nil, 
              vtCallback, 
              selfPointer, 
              &tmpSession); 

VT 콜백이 정의를 다음과 같이

let vtCallback : @convention(c) (UnsafeMutableRawPointer?, UnsafeMutableRawPointer?, OSStatus, VTEncodeInfoFlags, CMSampleBuffer?) -> Swift.Void = 
{ 
    (outputCallbackRefCon, sourceFrameRefCon, status, infoFlags, sampleBuffer) -> Swift.Void in 

    NSLog("vtCallback") 
} 

여러분의 도움에 감사드립니다!

답변

1

VTCompressionSessionCompleteFrames()에게 최종 프레임을 플러시 하시겠습니까? 나는이 API를 사용해 본 적이 없지만 그 호출은 mentioned here입니다.

+0

매우 좋습니다. 나는 실제로 그것을 먼저 부르지 않았고 나중에 추가했지만 재검사는하지 않았다. 이것은 분명히 문제의 근원이 아니기 때문에 내 "깊은"문제를 해결하지 못했습니다. 그러나 이것이 프레임이 어디로가는 지에 대한 질문을 해결하기 때문에, 이것은 확실히 좋은 대답입니다. 고마워요! –

+1

여러분을 환영합니다! 그것은 운이 좋았다, 나는 "flush"타입 api & 그것이 가장 가까운 것이었던 것을 찾고 있었다. –