获取音视频文件AVMetadata数据

问题来源:

http://stackoverflow.com/questions/16318821/extracting-mp3-album-artwork-in-ios

http://stackoverflow.com/questions/14030746/ios-avfoundation-how-do-i-fetch-artwork-from-an-mp3-file

做音乐播放器应用有时候需要获取音乐文件的一些数据信息,比如该音乐文件中的封面图片,艺人名,专辑名等,如何获取呢?本人抛砖引玉,写一个获取封面图片的类供大家参考.

//
// AVMetadataInfo.h
//
// http://home.cnblogs.com/u/YouXianMing/
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import <Foundation/Foundation.h> #warning 需要引入AVFoundation.framework @interface AVMetadataInfo : NSObject /**
获取音视频文件的Metadata信息(可以获取到mp3以及m4a的相关信息) *AVMetadataCommonKeyArtwork这个参数是可以换的,换不同的参数可以取得不同的值 *[注意]此方法中用到了信号量将异步操作转换成了同步操作,尽量在主线程中使用 @param fileURL 文件的URL地址
@return 一个包含了相关内容的字典
*/
+ (NSDictionary *)dataInfoFromFileURL:(NSURL *)fileURL; @end
//
// AVMetadataInfo.m
//
// http://home.cnblogs.com/u/YouXianMing/
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "AVMetadataInfo.h"
#import <AVFoundation/AVFoundation.h> @implementation AVMetadataInfo + (NSDictionary *)dataInfoFromFileURL:(NSURL *)fileURL
{
// 创建字典
NSMutableDictionary *dic = [NSMutableDictionary dictionary]; // 创建信号量(将异步变成同步)
dispatch_semaphore_t semaphore = dispatch_semaphore_create(); AVAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
[asset loadValuesAsynchronouslyForKeys:@[@"commonMetadata"]
completionHandler:^{
// 发送信号量
dispatch_semaphore_signal(semaphore);
}]; // 无限等待
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // 获取数据
NSArray *artworks = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata
withKey:AVMetadataCommonKeyArtwork
keySpace:AVMetadataKeySpaceCommon];
for (AVMetadataItem *item in artworks)
{
if ([item.keySpace isEqualToString:AVMetadataKeySpaceID3])
{
NSDictionary *dict = [item.value copyWithZone:nil]; // 获取图片
UIImage *image = [UIImage imageWithData:[dict objectForKey:@"data"]];
[dic setObject:image forKey:@"Artwork"];
}
if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes])
{
// 获取图片
UIImage *image = [UIImage imageWithData:[item.value copyWithZone:nil]];
[dic setObject:image forKey:@"Artwork"];
}
} return [NSDictionary dictionaryWithDictionary:dic];
} @end

引入头文件,然后

没有然后了,就是这么简单.想要获取其他信息,请读者自行修改,很简单的.

获取音视频文件AVMetadata数据的更多相关文章

  1. iOS - 获取音视频文件的Metadata信息

    // // MusicInfoArray.h // LocationMusic // // Created by Wengrp on 2017/6/22. // Copyright © 2017年 W ...

  2. FFmpeg开发实战(四):FFmpeg 抽取音视频的音频数据

    如何使用FFmpeg抽取音视频的音频数据,代码如下: void adts_header(char *szAdtsHeader, int dataLen); // 使用FFmpeg从视频中抽取音频 vo ...

  3. FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑

    FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...

  4. COS 音视频实践 | 数据工作流助你播放多清晰度视频

    前言 你是否遇到过这样的场景: 兴致勃勃地观看心爱的视频,正当到了激动人心的高潮部分,却突然因为网速过差被迫陷入"转圈圈"的人生以及社会的大思考中. 又或者是身为网速畅通无阻的vi ...

  5. Excel催化剂开源第37波-音视频文件元数据提取(分辨率,时长,采样率等)

    上一篇提到图片元信息Exif的提取,当然还有一类音视频文件,也同样存储着许多宝贵的元数据,那就开源到底呗,虽然自己找寻过程也是蛮艰辛坎坷的,大家看后有收获,只求多多传播下,让前人的工作可以更有价值. ...

  6. DirectShow 获取音视频输入设备列表

    开发环境:Win10 + VS2015 本文介绍一个 "获取音频视频输入设备列表" 的示例代码. 效果图 代码下载 代码下载(VC2015):Github - DShow_simp ...

  7. android获取mp4视频文件总时长和视频宽高<转>

    android使用 MediaMetadataRetriever 获取视频文件的 总时长 和视频的分辨率. 根据该方式获取视频信息可以看出不仅仅可以获取时长和分辨率,还能获取到其他的一些视频信息,不错 ...

  8. iOS开发- 获取本地视频文件

    下面具体介绍下实现过程.先看效果图.图1. 未实现功能前, iTunes截图 图2. 实现功能后, iTunes截图 图3. 实现功能后, 运行截图 好了, 通过图片, 我们可以看到实现的效果.功能包 ...

  9. asp.net 获取音视频时长 的方法

    http://www.evernote.com/l/AHPMEDnEd65A7ot_DbEP4C47QsPDYLhYdYg/ 日志:   1.第一种方法:   调用:shell32.dll ,win7 ...

随机推荐

  1. hbase学习(一)hbase简介

    1.hadoop生态系统 2.hbase简介 非关系型数据库知识面扩展 cassandra.hbase.mongodb.redis couchdb,文件存储数据库 Neo4j非关系型图数据库 3.hb ...

  2. Web开发:URL编码与解码

    通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如Url参数字符串中使用key= ...

  3. springboot1.5.4 idea 自动保存编译更新

    maven dependencies增加 <dependency> <groupId>org.springframework.boot</groupId> < ...

  4. Lunix含Ubuntu使用总结

    错误 鼠标闪烁解决 系统设置->显示—>未知显示器->关闭->应用->选择当前配置 提示sudo: unable to resolve host ,亦即无法解析主机. 原 ...

  5. scrollview和viewpager滑动冲突

    import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; i ...

  6. 【LeetCode two_pointer】11. Container With Most Water

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  7. 2017/11/6 Leetcode 日记

    2017/11/6 Leetcode 日记 344. Reverse String Write a function that takes a string as input and returns ...

  8. 阿里云提示Discuz memcache+ssrf GETSHELL漏洞如何解决

    一般这个漏洞都是下面文件,source/function/function_core.php 搜索下面代码: $content = preg_replace($_G['setting']['outpu ...

  9. 变量的解构赋值--ES6

    1. 数组的解构赋值 基本用法 let [a, b, c] = [1, 2, 3]; let [a,,c] = [1,2,3]; let [a,...b] = [1,2,3]; // a=1; b=[ ...

  10. codevs 2181 田忌赛马

    2181 田忌赛马 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond   题目描述 Description 中国古代的历史故事“田忌赛马”是为大家所熟知的.话说齐王 ...