zoukankan      html  css  js  c++  java
  • 获取音视频文件AVMetadata数据

    获取音视频文件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(0);
        
        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

    引入头文件,然后

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

  • 相关阅读:
    ORACLE中dba,user,v$等开头的常用表和视图
    rman restore spfile from backup
    oracle11g设置归档模式和非归档模式
    Oracle数据文件改名
    Linux下rz/sz安装及使用方法
    oracle数据库rman备份计划及恢复
    高级数据查询SQL语法
    关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
    关系数据库常用SQL语句语法大全
    微服务化的基石——持续集成【转】
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3681170.html
Copyright © 2011-2022 走看看