Как записать AVMetaDateItem в файл и получить к нему доступ позже?

Я использовал эту функцию для обрезки определенной части аудиофайла. В функции я пишу в новый файл два AVMetadataItems. Позднее я пытался получить доступ к этим элементам, нажав на URL с помощью AvURlAsset, а затем получив доступ к метаданным AVAsset / commonMetadata, и оба не содержали элемент, который я добавил ранее.

Поэтому я проверил, что происходит, прежде чем экспортировать файл, и, хотя я дал exporter.metadata массив oh AVMetadataitem, до экспорта он по-прежнему равен нулю.

кто-нибудь знает в чем проблема?

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)
    }
}

1 ответ

Вы должны двигаться completion?(trimmedFileUrl) внутри блока завершения exportAsynchronously,

Другие вопросы по тегам