首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从m4a音频文件中获取跟踪Id

如何从m4a音频文件中获取跟踪Id
EN

Stack Overflow用户
提问于 2021-01-05 17:59:06
回答 1查看 564关注 0票数 1

我可以从音频轨道获得一些信息,但不跟踪id。有人指点我怎么弄到追踪身份证吗?我正在使用xcode 12.3。谢谢!

代码语言:javascript
复制
func getM4aAudioDetails(afile: URL) {

        let song = Song(context: moc)
        let avasset = AVAsset(url: afile as URL) as AVAsset
        let metadata = avasset.metadata(forFormat: AVMetadataFormat.iTunesMetadata)
        let cmetadata = avasset.commonMetadata

        let titleItems = AVMetadataItem.metadataItems(from: metadata, withKey: "©nam", keySpace: AVMetadataKeySpace(rawValue: "itsk"))
        if let data = titleItems.first, let title = data.stringValue {
            song.title = title
        }

        let artistItems = AVMetadataItem.metadataItems(from: metadata, withKey: "©ART", keySpace: AVMetadataKeySpace(rawValue: "itsk"))
        if let data = artistItems.first, let artist = data.stringValue {
            song.artist = artist
        }

        let albumItems = AVMetadataItem.metadataItems(from: metadata, withKey: "©alb", keySpace: AVMetadataKeySpace(rawValue: "itsk"))
        if let data = albumItems.first, let album = data.stringValue {
            song.album = album
        }

        let trackItems = AVMetadataItem.metadataItems(from: metadata, withKey: "trkn", keySpace: AVMetadataKeySpace(rawValue: "itsk"))
        if let data = trackItems.first, let trackString = data.stringValue {
            
            song.track = Int64(trackString)!
            print("Track: \(song.track)")
        }

        let artworkItems = AVMetadataItem.metadataItems(from: cmetadata, filteredByIdentifier: .commonIdentifierArtwork)
        if let artworkItem = artworkItems.first {
            if let imageData = artworkItem.dataValue {
                //let image = NSImage(data: imageData)
                song.artwork = imageData as Data
                //print("image found")
            }
        }
        
        print("song title: \(song.title)")
        print("song artist: \(song.artist)")
        print("song name: \(song.album)")
        print("song track: \(song.track)")
    }

印刷品:(节选)

  • 歌曲标题:失败者

  • 歌曲艺术家: Beck

  • 歌曲名称:成熟黄金

  • 歌曲曲目: 0

  • 歌曲标题:Jack

  • 歌曲艺术家: Beck

  • 歌曲名称: Odelay

  • 歌曲曲目: 0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-05 20:27:26

您已经在trackItems中获得了轨道号。然而,它应该是一个dataValue,而不是stringValue

对于我的一首曲目,我看到了8个字节,看上去像是4个16位的大endian整数:

0x00000008000e0000

我的是14号轨道8,所以我想你要第二个整数。

以下是更多关于上述情况的轶事证据:

https://lists.apple.com/archives/cocoa-dev/2009/Oct/msg00952.html

您可以使用它来做您想做的事情(请注意keySpace/keys的符号):

代码语言:javascript
复制
if let trackItem = AVMetadataItem.metadataItems(from: metadata, filteredByIdentifier: .iTunesMetadataTrackNumber).first,
   let data = trackItem.dataValue,
   data.count == 8 {
    let bytes = [UInt8](data)
    let trackNumber = ((Int)(bytes[2]) << 8) | (Int)(bytes[3])
    let totalTracks = ((Int)(bytes[4]) << 8) | (Int)(bytes[5])
    print("trackNumber: \(trackNumber)/\(totalTracks)")
}

注: mp3/ID3的情况不同,在这种情况下,您需要id3/TRCK &它是一个包含整数的stringValue

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65584151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档