視頻的錄制卵史、保存战转、壓縮以及base64轉(zhuǎn)碼

這里沒有主要是說下和視頻相關(guān)的小技術(shù)點(diǎn),都是一些相對(duì)比較基本的以躯,但是對(duì)于沒有怎么和視頻打交道的人而言槐秧,找一些資料還不是很方便,所以今天就沒事白這些東西給稍微整理了一下忧设。
先看看視頻的錄制刁标,這里主要說的是使用系統(tǒng)的UIImagePickerController這個(gè)類進(jìn)行視頻的錄制。注意:導(dǎo)入這個(gè)框架才能錄制視頻#import<MobileCoreServices/MobileCoreServices.h>這個(gè)框架后才能播放進(jìn)入系統(tǒng)的錄制視頻界面址晕。

 //1膀懈、判斷照相機(jī)是否可用  不可用就直接return  一般都是這樣
    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        return;
    }
    //2.初始化
    UIImagePickerController *picker = [UIImagePickerController new];
    //3.設(shè)置類型
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    //通常4和5是一塊設(shè)置的
    //4.設(shè)置媒體類型  默認(rèn)是拍照
    picker.mediaTypes = @[(NSString *)kUTTypeMovie];
    //注意:如果是UIImagePickerControllerSourceTypePhotoLibrary設(shè)置下面的兩句會(huì)崩潰
  //5.設(shè)置攝像機(jī)模式
  picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo; //6.設(shè)置視頻質(zhì)量
//    picker.videoQuality = UIImagePickerControllerQualityTypeHigh;
    //7.設(shè)置代理
    picker.delegate = self;
    //8.模態(tài)彈出
    [self presentViewController:picker animated:YES completion:nil];

再看一下錄制的視頻如何保存到本地。注意:保存視頻到本地 需要這個(gè)資源庫<AssetsLibrary/AssetsLibrary.h>

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
    //1.判斷是否是視頻的媒體類型
    NSString *mediaType = info[UIImagePickerControllerMediaType];
    //2.保存視頻到本地   需要這個(gè)資源庫<AssetsLibrary/AssetsLibrary.h>
    //必須做這個(gè)判斷
   if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
      //這個(gè)已經(jīng)過期了  iOS9需要換成PHPhotoLibrary
      //2.1創(chuàng)建ALAssetsLibrary對(duì)象
      ALAssetsLibrary *assetsLibrary = [ALAssetsLibrary new];
      //2.2 這個(gè)url是指要保存的視頻的url 
       [assetsLibrary writeVideoAtPathToSavedPhotosAlbum:url completionBlock:^(NSURL *assetURL, NSError *error) {           
      }];
  }
    [picker dismissViewControllerAnimated:YES completion:nil];
}

下面是視頻的壓縮的一個(gè)類方法谨垃,以及刪除壓縮后視頻的方法启搂。代碼內(nèi)部有十分詳細(xì)的注釋硼控。說明一下第一個(gè)方法中傳入的sourceVideoPathString是這樣獲取的。在(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info這個(gè)方法中胳赌,通過
self.videoPathString = (NSString *)([info[@"UIImagePickerControllerMediaURL"] path]);這樣的形式獲取到路徑牢撼。

+ (void)compressVideoWithSourceVideoPathString:(NSString *)sourceVideoPathString
                                  CompressType:(NSString *)compressType
                          CompressSuccessBlock:(SuccessBlock)compressSuccessBlock
                           CompressFailedBlock:(FailedBlock)compressFailedBlock
                       CompressNotSupportBlock:(NotSupportBlock)compressNotSupportBlock {
    
    // 源視頻路徑
    NSURL *sourceVideoPathUrl = [NSURL fileURLWithPath:sourceVideoPathString];
    // 利用源視頻路徑將源視頻轉(zhuǎn)化為 AVAsset 多媒體載體對(duì)象
    AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:sourceVideoPathUrl options:nil];
    
    // 源視頻載體對(duì)象支持的壓縮格式
    NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];
    // 源視頻載體對(duì)象支持的壓縮格式中是否包含我們選擇的壓縮格式
    if ([compatiblePresets containsObject:compressType]) {
        
        // 存放壓縮視頻的文件夾
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSString *compressVideoFolder = [NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/compressVideoFolder"];
        if (![fileManager fileExistsAtPath:compressVideoFolder]) {
            
            [fileManager createDirectoryAtPath:compressVideoFolder withIntermediateDirectories:YES attributes:nil error:nil];
        }
        // 用當(dāng)前系統(tǒng)時(shí)間給文件命名, 避免因名字重復(fù)而覆蓋存儲(chǔ)
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];
        NSString *currentDateString = [formatter stringFromDate:[NSDate date]];
        
        /**
         *  第一個(gè)參數(shù) : 要壓縮的 AVAsset 對(duì)象
            第二個(gè)參數(shù) : 我們選擇的壓縮方式
         */
        AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:compressType];
        // 壓縮視頻的輸出路徑
        NSString *compressVideoPathString = [compressVideoFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"compressVideo-%@.mp4", currentDateString]];
        NSURL *compressFilePathUrl = [NSURL fileURLWithPath:compressVideoPathString];
        exportSession.outputURL = compressFilePathUrl;
        // 壓縮文件的輸出格式
        exportSession.outputFileType = AVFileTypeMPEG4;
        // 壓縮文件應(yīng)保證優(yōu)化網(wǎng)絡(luò)使用
        exportSession.shouldOptimizeForNetworkUse = YES;
        // 開始?jí)嚎s
        [exportSession exportAsynchronouslyWithCompletionHandler:^(void) {
            
            if (exportSession.status == AVAssetExportSessionStatusCompleted) {
                
                compressSuccessBlock(compressVideoPathString);
            }else {
                
                compressFailedBlock();
            }
        }];
    }else {
        
        compressNotSupportBlock();
    }
}
//刪除壓縮后視頻的方法
+ (void)deleteCompressVideoFromPath:(NSString *)compressVideoPathString {
    
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *compressVideoFolder = [NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/compressVideoFolder"];
    if ([fileManager fileExistsAtPath:compressVideoFolder]) {
        
        [fileManager removeItemAtPath:compressVideoFolder error:nil];
    }
}

視頻的base64轉(zhuǎn)碼,轉(zhuǎn)碼成功后將返回一堆字符串疑苫。

// 編碼
+ (void)base64StringFromString:(NSString *)filePathString
                    SuccessBlock:(SuccessBlock)success
                     FailedBlock:(FailedBlock)failed {
    
    // 獲取文件的二進(jìn)制數(shù)據(jù) data
    NSData *data = [NSData dataWithContentsOfFile:filePathString];
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        // 轉(zhuǎn)碼 --> 碼文
        NSString *base64String = [data base64EncodedStringWithOptions:0];
        
        if (base64String) {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                success(base64String);
            });
        }else {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                failed();
            });
        }
    });
}

//外部的調(diào)用形式
[ZWBase64EncodeTools base64StringFromString:self.filePathString SuccessBlock:^(NSString *string) {
            //轉(zhuǎn)碼成功后返回一堆字符串
            self.base64StringTextView.text = string;
            self.navigationItem.title = [NSString stringWithFormat:@"壓縮data的Base64碼, %.2fM", string.length / 1024.0 / 1024.0];
        } FailedBlock:^{
            
            self.navigationItem.title = @"轉(zhuǎn)碼失敗了!";
  }];

說道這里就順便說一下圖片的base64轉(zhuǎn)碼了熏版。下面方法中fileData是圖片的二進(jìn)制文件。

+ (void)base64StringFromData:(NSData *)fileData
                      SuccessBlock:(SuccessBlock)success
                   FailedBlock:(FailedBlock)failed {
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        // 轉(zhuǎn)碼 --> 碼文
        NSString *base64String = [fileData base64EncodedStringWithOptions:0];
        
        if (base64String) {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                success(base64String);
            });
        }else {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                failed();
            });
        }
    });
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捍掺,一起剝皮案震驚了整個(gè)濱河市撼短,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挺勿,老刑警劉巖曲横,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異满钟,居然都是意外死亡胜榔,警方通過查閱死者的電腦和手機(jī)胳喷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門湃番,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吭露,你說我怎么就攤上這事吠撮。” “怎么了讲竿?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵泥兰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我题禀,道長(zhǎng)鞋诗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任迈嘹,我火速辦了婚禮削彬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秀仲。我一直安慰自己融痛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布神僵。 她就那樣靜靜地躺著雁刷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪保礼。 梳的紋絲不亂的頭發(fā)上沛励,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天责语,我揣著相機(jī)與錄音,去河邊找鬼目派。 笑死鹦筹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的址貌。 我是一名探鬼主播铐拐,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼练对!你這毒婦竟也來了遍蟋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤螟凭,失蹤者是張志新(化名)和其女友劉穎虚青,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體螺男,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棒厘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了下隧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奢人。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淆院,靈堂內(nèi)的尸體忽然破棺而出何乎,到底是詐尸還是另有隱情,我是刑警寧澤土辩,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布支救,位于F島的核電站,受9級(jí)特大地震影響拷淘,放射性物質(zhì)發(fā)生泄漏各墨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一启涯、第九天 我趴在偏房一處隱蔽的房頂上張望贬堵。 院中可真熱鬧,春花似錦逝嚎、人聲如沸扁瓢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽引几。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伟桅,已是汗流浹背敞掘。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留楣铁,地道東北人玖雁。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盖腕,于是被迫代替她去往敵國(guó)和親赫冬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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