프레임 :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")
}
여러분의 도움에 감사드립니다!
매우 좋습니다. 나는 실제로 그것을 먼저 부르지 않았고 나중에 추가했지만 재검사는하지 않았다. 이것은 분명히 문제의 근원이 아니기 때문에 내 "깊은"문제를 해결하지 못했습니다. 그러나 이것이 프레임이 어디로가는 지에 대한 질문을 해결하기 때문에, 이것은 확실히 좋은 대답입니다. 고마워요! –
여러분을 환영합니다! 그것은 운이 좋았다, 나는 "flush"타입 api & 그것이 가장 가까운 것이었던 것을 찾고 있었다. –