4

Я пишу 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({ 
     .... 

}) 

Второй вопрос: есть ли способ избежать этого действия двойного шага?

+0

Ваш код [кажется, работает] (https://www.evernote.com/l/AFkQrSnCDj5GnKqUaUa5zEHio84Xf7p1SsA) для меня в Xcode 7.1+ Playground. – Moritz

+0

@ EricD. Ты уверен? Обратите внимание, что это не сбой для меня, но не записывает тег в файл! Вы проверили файл после его написания? – Teejay

+0

Единственное, что я уверен в том, что вы показали фрагмент кода, в котором говорится, что он генерирует ошибку, но этот код работал для меня на игровой площадке, поэтому я хотел бы поделиться этим на всякий случай. :) Теперь я понимаю, что это не то, что вы на самом деле имели в виду, поэтому вы, вероятно, хотите отредактировать свой вопрос, чтобы более четко отразить это. – Moritz

ответ

1

мне удалось добавить год тег с кодом с некоторыми изменениями:

let yearTag = AVMutableMetadataItem() 
yearTag.keySpace = AVMetadataKeySpaceiTunes 
yearTag.key = AVMetadataiTunesMetadataKeyReleaseDate 
yearTag.value = "2123" 

Я не мог заставить его работать с ключами ID3, так что я думал, что это может быть проблемой, и действительно, он работает с этими ключами iTunes. Кроме того, значение должно быть строкой (или NSString), а не объектом даты.

enter image description here

+0

Это может быть приемлемо для меня, также с iTunes KeySpace! – Teejay

+0

Только для справки, с ID3 KeySpace, ничего не работает между строкой, int, float или date. – Teejay

+0

Извините, но я не понимаю ваш первый комментарий, пожалуйста, объясните. Вы имеете в виду, что вы уже это сделали, но вы просите что-то еще? Я потерялся. : p – Moritz