iOS AVFoundation:如何从mp3文件中获取作品?
我的代码:
- (void)metadata { AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.fileURL options:nil]; NSArray *artworks = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyArtwork keySpace:AVMetadataKeySpaceCommon]; NSArray *titles = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyTitle keySpace:AVMetadataKeySpaceCommon]; NSArray *artists = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyArtist keySpace:AVMetadataKeySpaceCommon]; NSArray *albumNames = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyAlbumName keySpace:AVMetadataKeySpaceCommon]; AVMetadataItem *artwork = [artworks objectAtIndex:0]; AVMetadataItem *title = [titles objectAtIndex:0]; AVMetadataItem *artist = [artists objectAtIndex:0]; AVMetadataItem *albumName = [albumNames objectAtIndex:0]; if ([artwork.keySpace isEqualToString:AVMetadataKeySpaceID3]) { NSDictionary *dictionary = [artwork.value copyWithZone:nil]; self.currentSongArtwork = [UIImage imageWithData:[dictionary objectForKey:@"data"]]; } else if ([artwork.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { self.currentSongArtwork = [UIImage imageWithData:[artwork.value copyWithZone:nil]]; } self.currentSongTitle = [title.value copyWithZone:nil]; self.currentSongArtist = [artist.value copyWithZone:nil]; self.currentSongAlbumName = [albumName.value copyWithZone:nil]; self.currentSongDuration = self.audioPlayer.duration; }
这适用于从m4a文件中获取图稿,但不适用于mp3文件。 如果asset
指向一个mp3文件, artworks
是空的。 我做错了什么,如何解决?
我发现这些作品是asynchronous加载的,而图像是同步设置的。 我这样解决了它:
- (void)metadata { AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.fileURL options:nil]; NSArray *titles = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyTitle keySpace:AVMetadataKeySpaceCommon]; NSArray *artists = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyArtist keySpace:AVMetadataKeySpaceCommon]; NSArray *albumNames = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyAlbumName keySpace:AVMetadataKeySpaceCommon]; AVMetadataItem *title = [titles objectAtIndex:0]; AVMetadataItem *artist = [artists objectAtIndex:0]; AVMetadataItem *albumName = [albumNames objectAtIndex:0]; NSArray *keys = [NSArray arrayWithObjects:@"commonMetadata", nil]; [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ NSArray *artworks = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyArtwork keySpace:AVMetadataKeySpaceCommon]; for (AVMetadataItem *item in artworks) { if ([item.keySpace isEqualToString:AVMetadataKeySpaceID3]) { NSDictionary *d = [item.value copyWithZone:nil]; self.currentSongArtwork = [UIImage imageWithData:[d objectForKey:@"data"]]; } else if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { self.currentSongArtwork = [UIImage imageWithData:[item.value copyWithZone:nil]]; } } }]; self.currentSongTitle = [title.value copyWithZone:nil]; self.currentSongArtist = [artist.value copyWithZone:nil]; self.currentSongAlbumName = [albumName.value copyWithZone:nil]; self.currentSongDuration = self.audioPlayer.duration; }
我刚刚在这里find了答案: 如何从ios开发中的mp3文件提取元数据,现在正在查看为什么代码不能在m4a文件上工作。 我从你的代码中拿出了一点点,并提出了似乎适用于m4a和mp3的以下内容。 请注意,我把这个代码作为一个没有限定符的open else子句来工作 – 如果有人获得更多的经验,那么欢迎他们的提炼!
- (void)getMetaDataForSong:(MusicItem *)musicItem { AVAsset *assest; // filePath looks something like this: /var/mobile/Applications/741647B1-1341-4203-8CFA-9D0C555D670A/Library/Caches/All Summer Long.m4a NSURL *fileURL = [NSURL fileURLWithPath:musicItem.filePath]; NSLog(@"%@", fileURL); assest = [AVURLAsset URLAssetWithURL:fileURL options:nil]; NSLog(@"%@", assest); for (NSString *format in [assest availableMetadataFormats]) { for (AVMetadataItem *item in [assest metadataForFormat:format]) { if ([[item commonKey] isEqualToString:@"title"]) { musicItem.strSongTitle = (NSString *)[item value]; } if ([[item commonKey] isEqualToString:@"artist"]) { musicItem.strArtistName = (NSString *)[item value]; } if ([[item commonKey] isEqualToString:@"albumName"]) { musicItem.strAlbumName = (NSString *)[item value]; } if ([[item commonKey] isEqualToString:@"artwork"]) { UIImage *img = nil; if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { img = [UIImage imageWithData:[item.value copyWithZone:nil]]; } else { // if ([item.keySpace isEqualToString:AVMetadataKeySpaceID3]) { NSData *data = [(NSDictionary *)[item value] objectForKey:@"data"]; img = [UIImage imageWithData:data] ; } musicItem.imgArtwork = img; } } } }
- 如何正确地停止和删除iOS11中的audioTapProcessor
- iOS:在后台应用程序中访问设备麦克风
- iPhone 7 Plus – AVFoundation双摄像头
- video在应用AVVideoComposition后旋转
- AVAudioEngine播放多声道audio
- Swift AVCaptureSessionclosures打开button错误:当前不支持多个audio/videoAVCaptureInputs
- 捕获仍然没有压缩UIImage(从CMSampleBufferRef)?
- 我如何使用AVAssetWriter?
- 如何使用AVAssetWriter将静态和dynamic叠加添加到video?