Я пишу ID3 тегов в файл с помощью AVMetaDataItem
Запись ID3-теги с помощью AVMetaDataItem
var soundFileMetadata = [AVMetadataItem]()
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyArtist, "MyArtist")!)
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeySongName, "MySong")!)
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyAlbum, "MyAlbum")!)
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyUserGenre, "MyGenre")!)
soundFileMetadata.append(createMetadata(AVMetadataiTunesMetadataKeyComposer, "MyComposer")!)
Вот метод createMetadata
удобства:
func createMetadata(tagKey: String, _ tagValue: AnyObject?,
keySpace:String = AVMetadataKeySpaceiTunes) -> AVMutableMetadataItem? {
if let tagValue = tagValue {
let tag = AVMutableMetadataItem()
tag.keySpace = keySpace
tag.key = tagKey
tag.value = (tagValue as? String) ?? (tagValue as? Int)
return tag
}
return nil
}
Затем я попытался написать также год тег, без успеха:
let comps = NSDateComponents()
comps.year = 2010;
let yearTag = AVMutableMetadataItem()
yearTag.keySpace = AVMetadataKeySpaceID3
yearTag.key = AVMetadataID3MetadataKeyYear
yearTag.value = NSCalendar.currentCalendar().dateFromComponents(comps)
soundFileMetadata.append(yearTag)
В этом случае я получаю эту ошибку:
FigMetadataCreateConverter signalled err=-12482 (kFigMetadataConverterError_UnsupportedFormat) (Unsupported format conversion) at /SourceCache/CoreMedia/CoreMedia-1562.238/Prototypes/Metadata/Converters/FigMetadataConverterCommon.c line 118
Обратите внимание, что это простая ошибка, напечатанная на консоли, а не исключение!
писать Также это как String
, как Int
о даже Float
, приводит меня к одной и той же ошибки. То же самое относится к количеству дорожек/дисков, меток дорожек/дисков.
Первый вопрос: как их написать?
У меня также есть другой вопрос.
В настоящее время я никогда AVAudioRecorder
, я нашел не способ написания тегов непосредственно в выходной файл записывающего устройства, поэтому я посвящаю файл магнитофона, откройте его с помощью AVURLAsset
и реэкспорта с AVAssetExportSession
:
self.recorder.stop()
let urlAsset = AVURLAsset(URL: srcSoundFileURL)
let assetExportSession: AVAssetExportSession! = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetPassthrough)
assetExportSession.outputFileType = AVFileTypeAppleM4A
assetExportSession.outputURL = tmpSoundFileURL
assetExportSession.metadata = soundFileMetadata
assetExportSession.exportAsynchronouslyWithCompletionHandler({
....
})
Второй вопрос: есть ли способ избежать этого действия двойного шага?
Ваш код [кажется, работает] (https://www.evernote.com/l/AFkQrSnCDj5GnKqUaUa5zEHio84Xf7p1SsA) для меня в Xcode 7.1+ Playground. – Moritz
@ EricD. Ты уверен? Обратите внимание, что это не сбой для меня, но не записывает тег в файл! Вы проверили файл после его написания? – Teejay
Единственное, что я уверен в том, что вы показали фрагмент кода, в котором говорится, что он генерирует ошибку, но этот код работал для меня на игровой площадке, поэтому я хотел бы поделиться этим на всякий случай. :) Теперь я понимаю, что это не то, что вы на самом деле имели в виду, поэтому вы, вероятно, хотите отредактировать свой вопрос, чтобы более четко отразить это. – Moritz