计算视频文件 md5(hash)

Posted

技术标签:

【中文标题】计算视频文件 md5(hash)【英文标题】:Calculate video file md5(hash) 【发布时间】:2017-02-22 09:03:06 【问题描述】:

我必须计算所选文件(图像、视频)的校验和

在我的代码中,图像计算效果很好,但视频计算根本不起作用。

我正在使用 CryptoSwift

这是我所做的代码

import CryptoSwift

class MD5Calculator 

    static func imageChecksum(imageArray: [UIImage], onCalculated: @escaping ([String]) -> Void)

        DispatchQueue.global(qos: .userInitiated).async 

            var array: [String] = []                        
            for chosenImage in imageArray 
                if let jpegData = UIImageJPEGRepresentation(chosenImage, 80) 
                    let checksum = jpegData.md5()
                    let chsum = checksum.toHexString()
                    array.append(chsum)
                
            

            DispatchQueue.main.async 
                onCalculated(array)
            
        
    

    static func videoChecksum(videoURLs:[NSURL], onCalculated: @escaping ([String]) -> Void) 
        DispatchQueue.global(qos: .userInitiated).async 

            var array: [String] = []

            for url in videoURLs 
                if let videoData = Data(contentsOf: url as URL, options: Data.ReadingOptions) 
                    let checksum = videoData.md5()
                    let chsum = checksum.toHexString()
                    array.append(chsum)

                
            

            DispatchQueue.main.async 
                onCalculated(array)
            
        
    

在 videoChecksum 中我无法获取数据我在行中有语法错误

 if let videoData = Data(contentsOf: url as URL, options: Data.ReadingOptions) 

错误是:

Cannot convert value of type 'Data.ReadingOptions.Type' (aka 'NSData.ReadingOptions.Type') to expected argument type 'Data.ReadingOptions' (aka 'NSData.ReadingOptions')

这是数据类构造函数

public init(contentsOf url: URL, options: Data.ReadingOptions = default) throws

我的问题是

1.如何获取视频文件的数据

2。如果有另一种获取数据和计算校验和的方法,请建议我

3.如果您知道什么语法错误,请告诉我如何修复它。

【问题讨论】:

【参考方案1】:

调用时好像有语法错误

let videoData = Data(contentsOf: url as URL, options: Data.ReadingOptions)

因为options 参数需要ReadingOptions 值之一,而您正在传递类型本身。一个有效的调用如下所示:

let videoData = Data(contentsOf: url as URL, options: Data.ReadingOptions.uncached)

(有关可能的值,请参阅official documentation。)

如果您不确定要提供什么值,则可以省略传递默认参数,即:

let videoData = Data(contentsOf: url as URL)

编辑: 另请注意,Data(contentsOf:options:) 初始化程序“throws”因此理想情况下您应该将调用包装在 do / try / catch 语句中,如下所示:

for url in videoURLs 
    do 
        let videoData = try Data(contentsOf: url as URL)
        let checksum = videoData.md5()
        let chsum = checksum.toHexString()
        array.append(chsum)
     catch 
        // TODO: Handle error
        print(error.localizedDescription)
    

希望这会有所帮助。

【讨论】:

很高兴听到 :) 另请参阅我关于异常处理的编辑。【参考方案2】:

试试这个

ALAssetRepresentation *rep = [asset defaultRepresentation]; 字节 buffer = (Byte)malloc((NSUInteger)rep.size); NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:(NSUInteger)rep.size error:nil]; NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];

【讨论】:

以上是关于计算视频文件 md5(hash)的主要内容,如果未能解决你的问题,请参考以下文章

md5是啥

Python 文件Hash(MD5,SHA1)

Hash(MD5校验工具)

修改视频MD5值

修改视频MD5值

《硬核干货》简单好用视频图片文件MD5值修改工具类