• 获取音视频文件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

    引入头文件,然后

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

  • 相关阅读:
    使用redis 的订阅服务
    vue 的provide 和 inject
    yolov4检测识别不出目标的问题
    jetson nano 安装anaconda和pytorch(转)
    winform 程序退出时强制关闭所有线程
    jetson nano ubuntu18.04 ros1和ros2安装大象机械手mycobot系列 的ROS 包
    PHP SSE 服务器推送消息给浏览器 PHP
    vue vuetemplatecompiler版本不一致的问题
    Convert gif to Base64 String Using JavaScript
    vue uniapp 使用 fontawesome 打包Android 图片svg 不显示解决方案
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3681170.html
Copyright © 2020-2023  润新知