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

    引入头文件,然后

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

  • 相关阅读:
    js 右击
    javascript 中的函数,控制流, 事件委托
    javascript 的 this , js 线程
    javascript 中的var : 隐含变量 全局变量 变量提升
    明日
    ajax循环json 中的 for(var prop in data) 与 hasProperty()
    js继承机制
    callee, caller,toString(),String()
    解决eclipse中jsp下无代码提示问题
    商业模式
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3681170.html
Copyright © 2011-2022 走看看