Как я могу получить метаданные файла FLAC в Swift на iOS 11?

Мне нужно получить метаданные файла FLAC. Я попробовал следующий код:

let item = AVPlayerItem(url: URL(fileURLWithPath: path))
    let commonMetadata = item.asset.commonMetadata

    songInfo[ARTIST_NAME] = "Unknown"
    songInfo[GENRE_NAME] = "Unknown"
    songInfo[ALBUM_NAME] = "Unknown"
    songInfo[PLAY_COUNT] = "0"

    for metadataItem in commonMetadata {
        switch metadataItem.commonKey?.rawValue ?? "" {
        case "type":
            songInfo[GENRE_NAME] = metadataItem.stringValue
        case "albumName":
            songInfo[ALBUM_NAME]  = metadataItem.stringValue
        case "artist":
            songInfo[ARTIST_NAME] = metadataItem.stringValue
        default: break
        }
    } 

Но это не работает для файла FLAC. Любая помощь будет оценена.


person Return Zero    schedule 11.09.2018    source источник
comment
Эй, @Ajharul, ты пробовал мое предложение ниже?   -  person mijokaliger    schedule 08.01.2019


Ответы (2)


Просто используйте API AudioToolbox:

func audioFileInfo(url: URL) -> NSDictionary? {
    var fileID: AudioFileID? = nil
    var status:OSStatus = AudioFileOpenURL(url as CFURL, .readPermission, kAudioFileFLACType, &fileID)

    guard status == noErr else { return nil }

    var dict: CFDictionary? = nil
    var dataSize = UInt32(MemoryLayout<CFDictionary?>.size(ofValue: dict))

    guard let audioFile = fileID else { return nil }

    status = AudioFileGetProperty(audioFile, kAudioFilePropertyInfoDictionary, &dataSize, &dict)

    guard status == noErr else { return nil }

    AudioFileClose(audioFile)

    guard let cfDict = dict else { return nil }

    let tagsDict = NSDictionary.init(dictionary: cfDict)

    return tagsDict
}

Пример вывода:

- 0 : 2 elements
    * key : artist
    * value : Blue Monday FM
- 1 : 2 elements
    * key : title
    * value : Bee Moved
- 2 : 2 elements
    * key : album
    * value : Bee Moved
- 3 : 2 elements
    * key : approximate duration in seconds
    * value : 39.876
- 4 : 2 elements
    * key : source encoder
    * value : reference libFLAC 1.2.1 win64 200807090
person mijokaliger    schedule 02.01.2019
comment
пробовал с вашим кодом. в моем случае я получаю только приблизительную продолжительность в секундах. - person Return Zero; 13.01.2019
comment
Вы уверены, что ваш файл flac содержит нужные вам метаданные? Я использовал первый результат Google для код примера. Вот результат exiftool < /a> для этого файла. - person mijokaliger; 13.01.2019
comment
Метаданные, которые вы ищете, написаны в VORBIS_COMMENT, я обновлю ответ, если AudiToolbox API умеет разбирать. - person mijokaliger; 13.01.2019
comment
Это странно, в файле примера, который я использовал, также есть метаданные, записанные как VORBIS_COMMENT здесь как метаданные вашего вывода. - person mijokaliger; 13.01.2019
comment
@mijokaliger, вы знаете, как писать метаданные файла FLAC? Как приведенный выше код для чтения метаданных. Но я хочу ЗАПИСАТЬ FLAC метаданные файла. - person Hardip Kalola; 17.01.2019

В моем случае я использовал https://github.com/CodeEagle/APlay. Вы можете написать этот код для получения метаданных.

let mediaPlayer = APlay()
mediaPlayer.play("local_document_path/file.flac")
print(a.metadatas)

// выход

[APlay.MetadataParser.Item.year("2009"), APlay.MetadataParser.Item.album("Music From Braid"), APlay.MetadataParser.Item.track("03"), APlay.MetadataParser.Item.title("Lullaby Set"), APlay.MetadataParser.Item.artist("Kammen & Swan"), APlay.MetadataParser.Item.genre("Folk, World, & Country/Stage & Screen/Soundtrack")]
person Krishna Kumar Thakur    schedule 29.12.2018
comment
спасибо за ваш ответ @Krishna. Я попробовал ваше решение. В моем случае он смог найти только название песни, год и номер трека. но мне нужно имя исполнителя, название альбома, жанр. Мне также нужны метаданные без воспроизведения песни. - person Return Zero; 31.12.2018