计算视频文件md5(哈希)

时间:2017-02-22 09:03:06

标签: ios objective-c swift swift3

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

在我的代码图像计算中运行良好,但视频计算根本无法正常工作。

我正在使用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')

这是Data类构造函数

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

我的问题是

1。我怎样才能获得视频文件数据

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

第3。如果你知道它的语法错误,请告诉我如何修复它。

2 个答案:

答案 0 :(得分:2)

调用

时似乎有语法错误
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)
    }
}

希望这有帮助。

答案 1 :(得分:0)

试试这个

ALAssetRepresentation * rep = [asset defaultRepresentation]; 字节缓冲区=(字节)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];