【问题标题】:Calculate video file md5(hash)计算视频文件 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.如果您知道什么语法错误,请告诉我如何修复它。

【问题讨论】:

    标签: ios objective-c swift swift3


    【解决方案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];

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-18
      • 2015-12-18
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      相关资源
      最近更新 更多