iOS獲取相冊視頻的MD5方法(最好)

在網(wǎng)上查了好多方法復(fù)制過來都有問題包蓝,最后找了這個是最準(zhǔn)確的彪置,幫大家減少走彎路泡垃。

ADUtilHelper.h

//獲取視頻MD5
#import <Foundation/Foundation.h>
#import <SystemConfiguration/CaptiveNetwork.h>
@interface ADUtilHelper : NSObject

+(NSString *)getFileMD5WithPath:(NSString*)path;
+(NSString *)getWifiName;
@end

ADUtilHelper.m

#define FileHashDefaultChunkSizeForReadingData 1024*8 

#import "ADUtilHelper.h"
#include <CommonCrypto/CommonDigest.h>

@implementation ADUtilHelper

+(NSString*)getFileMD5WithPath:(NSString*)path
{
    return (__bridge_transfer NSString *)FileMD5HashCreateWithPath((__bridge CFStringRef)path, FileHashDefaultChunkSizeForReadingData);
}

CFStringRef FileMD5HashCreateWithPath(CFStringRef filePath,size_t chunkSizeForReadingData) {
    // Declare needed variables
    CFStringRef result = NULL;
    CFReadStreamRef readStream = NULL;
    // Get the file URL
    CFURLRef fileURL =
    CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
                                  (CFStringRef)filePath,
                                  kCFURLPOSIXPathStyle,
                                  (Boolean)false);
    if (!fileURL) goto done;
    // Create and open the read stream
    readStream = CFReadStreamCreateWithFile(kCFAllocatorDefault,
                                            (CFURLRef)fileURL);
    if (!readStream) goto done;
    bool didSucceed = (bool)CFReadStreamOpen(readStream);
    if (!didSucceed) goto done;
    // Initialize the hash object
    CC_MD5_CTX hashObject;
    CC_MD5_Init(&hashObject);
    // Make sure chunkSizeForReadingData is valid
    if (!chunkSizeForReadingData) {
        chunkSizeForReadingData = FileHashDefaultChunkSizeForReadingData;
    }
    // Feed the data to the hash object
    bool hasMoreData = true;
    while (hasMoreData) {
        uint8_t buffer[chunkSizeForReadingData];
        CFIndex readBytesCount = CFReadStreamRead(readStream,(UInt8 *)buffer,(CFIndex)sizeof(buffer));
        if (readBytesCount == -1) break;
        if (readBytesCount == 0) {
            hasMoreData = false;
            continue;
        }
        CC_MD5_Update(&hashObject,(const void *)buffer,(CC_LONG)readBytesCount);
    }
    // Check if the read operation succeeded
    didSucceed = !hasMoreData;
    // Compute the hash digest
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5_Final(digest, &hashObject);
    // Abort if the read operation failed
    if (!didSucceed) goto done;
    // Compute the string result
    char hash[2 * sizeof(digest) + 1];
    for (size_t i = 0; i < sizeof(digest); ++i) {
        snprintf(hash + (2 * i), 3, "%02x", (int)(digest[i]));
    }
    result = CFStringCreateWithCString(kCFAllocatorDefault,(const char *)hash,kCFStringEncodingUTF8);
    
done:
    if (readStream) {
        CFReadStreamClose(readStream);
        CFRelease(readStream);
    }
    if (fileURL) {
        CFRelease(fileURL);
    }
    return result;
}

+(NSString *)getWifiName{
    NSString *wifiName = @"";
    
    CFArrayRef wifiInterfaces = CNCopySupportedInterfaces();
    
    if (!wifiInterfaces) {
        return nil;
    }
    
    NSArray *interfaces = (__bridge NSArray *)wifiInterfaces;
    
    for (NSString *interfaceName in interfaces) {
        CFDictionaryRef dictRef = CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interfaceName));
        
        if (dictRef) {
            NSDictionary *networkInfo = (__bridge NSDictionary *)dictRef;
            NSLog(@"network info -> %@", networkInfo);
            wifiName = [networkInfo objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID];
            NSLog(@"wifiName----%@",wifiName);
            CFRelease(dictRef);
        }
    }
    
    CFRelease(wifiInterfaces);
    return wifiName;


}
@end

補(bǔ)充:相冊視頻獲取url并把視頻文件存入沙盒

獲取相冊視頻

//代理
UIImagePickerControllerDelegate,UINavigationControllerDelegate
  //從手機(jī)相冊選取視頻
            UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
            imagePicker.delegate = self;
            //視頻編輯
            imagePicker.allowsEditing = YES;
            //相冊選取==UIImagePickerControllerSourceTypeSavedPhotosAlbum(打開所有視頻努释,而不是列表)
            imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
            //設(shè)置選取類型苫耸,只能是視頻
            imagePicker.mediaTypes =  [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
            
            [self presentViewController:imagePicker animated:YES completion:nil];

#pragma mark -
#pragma UIImagePickerController Delegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    if ([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:(NSString*)kUTTypeImage]) {
        //獲取到圖片
//        UIImage  *img = [info objectForKey:UIImagePickerControllerEditedImage];
//        self.fileData = UIImageJPEGRepresentation(img, 1.0);
    } else if ([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:(NSString*)kUTTypeMovie]) {
        //獲取到視頻路徑(有些視頻沒有這個值,所以不用他)
//        NSString *videoPath1 = [[info objectForKey:UIImagePickerControllerMediaURL] path];

        //獲取視頻的url(所有視頻都有這個值)
        NSURL * videoXT_URL = [info objectForKey:UIImagePickerControllerReferenceURL];
         [picker dismissViewControllerAnimated:YES completion:nil];
    }
}


存入沙盒

//系統(tǒng)視頻上傳存儲沙盒路徑(再用)臨時(shí)緩存:NSCachesDirectory
#define KVideoUrlPath   \
[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"XiumeiVideoURLDWB"]
// 將原始視頻的URL轉(zhuǎn)化為NSData數(shù)據(jù),寫入沙盒
- (void)getPhoneDateVideo:(NSURL *)url
{
    // 解析一下,為什么視頻不像圖片一樣一次性開辟本身大小的內(nèi)存寫入?
    // 想想,如果1個視頻有1G多,難道直接開辟1G多的空間大小來寫?
    // 創(chuàng)建存放原始圖的文件夾--->VideoURL
    NSFileManager * fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:KVideoUrlPath]) {
        [fileManager createDirectoryAtPath:KVideoUrlPath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    
    ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        if (url) {
            [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
                ALAssetRepresentation *rep = [asset defaultRepresentation];
                //路徑后面拼接當(dāng)前日期做區(qū)分贸人,否則會讀取成一個文件
//                NSString * dateString = [NSString getNowDateFormat:@"yyyyMMddHHmmss"];
                //視頻名字
                NSString * dateString = rep.filename;
//                NSLog(@"%@",dateString);
                NSString * videoPath = [KVideoUrlPath stringByAppendingPathComponent:dateString];
                const char *cvideoPath = [videoPath UTF8String];
                FILE *file = fopen(cvideoPath, "a+");
                if (file) {
                    const int bufferSize = 11024 * 1024;
                    // 初始化一個1M的buffer
                    Byte *buffer = (Byte*)malloc(bufferSize);
                    NSUInteger read = 0, offset = 0, written = 0;
                    NSError* err = nil;
                    if (rep.size != 0)
                    {
                        do {
                            read = [rep getBytes:buffer fromOffset:offset length:bufferSize error:&err];
                            written = fwrite(buffer, sizeof(char), read, file);
                            offset += read;
                        } while (read != 0 && !err);//沒到結(jié)尾间景,沒出錯,ok繼續(xù)
                    }
                    // 釋放緩沖區(qū)艺智,關(guān)閉文件
                    free(buffer);
                    buffer = NULL;
                    fclose(file);
                    file = NULL;
                    
                    // UI的更新記得放在主線程,要不然等子線程排隊(duì)過來都不知道什么年代了,會很慢的
                    dispatch_async(dispatch_get_main_queue(), ^{
                        //獲取視頻MD5
                       self.videoStringMD5 = [ADUtilHelper getFileMD5WithPath:videoPath];
//                        NSLog(@"視頻的MD5:%@",self.videoStringMD5);
                    });
                }else{
                    dispatch_async(dispatch_get_main_queue(), ^{
                        
                        [DWBToast showCenterWithText:@"視頻處理失敗"];
                        
                    });
                }
            } failureBlock:^(NSError *error) {
                
                dispatch_async(dispatch_get_main_queue(), ^{
                    
                    [DWBToast showCenterWithText:@"視頻處理失敗"];
                    
                });
                
            }];
        }
    });
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倘要,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子十拣,更是在濱河造成了極大的恐慌封拧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夭问,死亡現(xiàn)場離奇詭異泽西,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缰趋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門捧杉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秘血,你說我怎么就攤上這事味抖。” “怎么了灰粮?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵仔涩,是天一觀的道長。 經(jīng)常有香客問我粘舟,道長熔脂,這世上最難降的妖魔是什么佩研? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮霞揉,結(jié)果婚禮上旬薯,老公的妹妹穿的比我還像新娘。我一直安慰自己适秩,他們只是感情好袍暴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隶症,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岗宣。 梳的紋絲不亂的頭發(fā)上蚂会,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音耗式,去河邊找鬼胁住。 笑死,一個胖子當(dāng)著我的面吹牛刊咳,可吹牛的內(nèi)容都是我干的彪见。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼娱挨,長吁一口氣:“原來是場噩夢啊……” “哼余指!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跷坝,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酵镜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柴钻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淮韭,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年贴届,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了靠粪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毫蚓,死狀恐怖占键,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绍些,我是刑警寧澤捞慌,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站柬批,受9級特大地震影響啸澡,放射性物質(zhì)發(fā)生泄漏袖订。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一嗅虏、第九天 我趴在偏房一處隱蔽的房頂上張望洛姑。 院中可真熱鬧,春花似錦皮服、人聲如沸楞艾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硫眯。三九已至,卻和暖如春择同,著一層夾襖步出監(jiān)牢的瞬間两入,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工敲才, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裹纳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓紧武,卻偏偏與公主長得像剃氧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阻星,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容