I tried to translate the code of AVTimedAnnotationWriter from Objective-C to Swfit. Everything works but when I'm writing the metadata part, it fails.
I noticed that when the mediaType = "meta" (line13). It will occur one more copyNextTimedMetadataGroup(). Any idea?
func startReadingAndWritingWithCompletionHandler(localCompletionHandler: dispatch_block_t) {
self.completionHandler = localCompletionHandler
assetWriterInput?.requestMediaDataWhenReadyOnQueue(serializationQueue!, usingBlock: { () -> Void in
if(self.finished!) {
return
}
var completedOrFailed: Bool = false
/
while ((self.assetWriterInput?.readyForMoreMediaData)! && !completedOrFailed) {
var sampleBuffer: CMSampleBufferRef? = nil
var metadataGroup: AVTimedMetadataGroup? = nil
if((self.assetWriterInput?.mediaType)! == "meta") {
metadataGroup = self.metadataSampleProvider?.copyNextTimedMetadataGroup()
}
else {
sampleBuffer = self.sampleProvider!.copyNextSampleBuffer()
}
if (sampleBuffer != nil) {
let success: Bool = (self.assetWriterInput?.appendSampleBuffer(sampleBuffer!))!
sampleBuffer = nil
}
else if (metadataGroup != nil) {
let success: Bool = (self.assetWriterAdaptor?.appendTimedMetadataGroup(metadataGroup!))!
completedOrFailed = !success
}
else {
completedOrFailed = true
}
}
if(completedOrFailed) {
self.callCompletionHandlerIfNecessary()
}
})
}My AVTimedMetadataGroup count is exactly 181. But the copyNextTimedMetadataGroup() will run 182 times. In other words, the last try will return nil. (Error)
func copyNextTimedMetadataGroup() -> AVTimedMetadataGroup {
var group: AVTimedMetadataGroup?
// self.currentSampleNum = 0 ; self.numOfSamples = 181
if (self.currentSampleNum < self.numOfSamples)
{
group = self.metadataSamples[currentSampleNum] as! AVTimedMetadataGroup
self.currentSampleNum++
}
return group!
}