0

Ich habe diese Funktion ausgeführt, um einen bestimmten Teil einer Audiodatei zu trimmen. In der Funktion schreibe ich in die neue Datei zwei AVMetadataItems. Ich habe versucht, später auf diese Elemente zuzugreifen, indem ich die URL mit AvURlAsset geklickt habe und dann auf die MetaSaten/commonMetadata von AVAsset zugegriffen habe und beide das zuvor hinzugefügte Element nicht enthielten.Wie schreibt man AVMetaDateItem in eine Datei und greift später darauf zu?

Also überprüfte ich, was passiert, bevor ich die Datei exportiere, und obwohl ich exporter.metadata ein Array oh AVMetadataItem gegeben habe, scheint es vor dem Export immer noch Null zu sein.

Jeder weiß, was ist das Problem?

func trimFromOffSetWithDuration(_ from: Date, startOffSet: TimeInterval, duration: TimeInterval, newfileName: String, file: URL, completion: fileExportaionBlock?) { 

    if let asset = AVURLAsset(url: file) as AVAsset? { 

     let trimmedFileUrl = documentsDirectory().appendingPathComponent(newfileName) 

     let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A) 
     exporter?.outputFileType = AVFileTypeAppleM4A 
     exporter?.outputURL = trimmedFileUrl 

     let start = CMTimeMake(Int64(startOffSet), 1) 
     let end = CMTimeMake(Int64(startOffSet + duration), 1) 
     exporter?.timeRange = CMTimeRangeFromTimeToTime(start, end) 

     let typeMetaDataItem = AVMutableMetadataItem() 
     typeMetaDataItem.key = AVMetadataCommonKeyDescription as NSCopying & NSObjectProtocol 
     typeMetaDataItem.keySpace = AVMetadataKeySpaceCommon 
     typeMetaDataItem.value = TrackType.recording.rawValue as NSCopying & NSObjectProtocol 

     let dateMetaDataItem = AVMutableMetadataItem() 
     dateMetaDataItem.key = AVMetadataCommonKeyCreationDate as NSCopying & NSObjectProtocol 
     dateMetaDataItem.keySpace = AVMetadataKeySpaceCommon 
     dateMetaDataItem.value = from as NSCopying & NSObjectProtocol 

     exporter?.metadata? = [dateMetaDataItem, typeMetaDataItem] 
     exporter?.exportAsynchronously { handler in 

      if exporter?.status != AVAssetExportSessionStatus.completed { 
       print("Error while exporting \(exporter?.error?.localizedDescription ?? "unknown")") 
       completion?(nil) 
       return 
      } 
     } 

     completion?(trimmedFileUrl) 
    } 
} 

Antwort

0

Sie sollten completion?(trimmedFileUrl) innerhalb der Fertigstellung Block exportAsynchronously bewegen.

+0

Ich verstehe, was Sie meinen, aber es funktioniert immer noch nicht, das ist nicht das Problem, danke irgendwie! –

Verwandte Themen