視頻的錄制狡汉、截圖和壓縮

什么是視頻錄制

視頻錄制其實(shí)就是一個類似于拍電影的過程浅悉,通過手機(jī)的攝像頭和麥克風(fēng),錄入聲音和畫面冗酿,然后經(jīng)過一個加工廠加工埠对,然后導(dǎo)出,就變成了我們口中定義的視頻裁替。接下來项玛,我會帶大家看一下,iOS中的視頻錄制到底是怎么做的弱判,讓大家能初步地寫出一個錄制視頻的小demo襟沮。當(dāng)然,還會教大家怎么進(jìn)行視頻圖像的捕獲還有壓縮昌腰。

iOS如何進(jìn)行視頻錄制

  1. 視頻錄制需要導(dǎo)入一個框架--AVFoundation框架
#import <AVFoundation/AVFoundation.h>
  1. 根據(jù)前言的分析,所以我們需要設(shè)置四個屬性來進(jìn)行視頻錄制的相關(guān)配置
//輸入聲音     
@property (nonatomic, strong) AVCaptureDeviceInput *inputAudio; 
//輸入畫面     
@property (nonatomic, strong) AVCaptureDeviceInput *inputVideo; 
//會話屬性     
@property (nonatomic, strong) AVCaptureSession *session;
//導(dǎo)出   
@property (nonatomic, strong) AVCaptureMovieFileOutput *output;
  1. 我們就做一個簡單點(diǎn)的demo开伏,在touchesBegan方法中進(jìn)行視頻錄制相關(guān)操作
    // 3.創(chuàng)建對象,并且實(shí)例化
    // 3.1創(chuàng)建一個設(shè)備
    // 聲音
   AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
   self.inputAudio = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
   
   // 3.2畫面
   AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
   
   self.inputVideo = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];
   
   // 3.3會話
   self.session = [[AVCaptureSession alloc] init];
   
   // 3.4 導(dǎo)出
   self.output = [[AVCaptureMovieFileOutput alloc] init];
  1. 添加到加工廠(輸入&輸出)
    if ([self.session canAddInput:self.inputAudio]) {
        [self.session addInput:self.inputAudio];
    }
    if ([self.session canAddInput:self.inputVideo]) {
        [self.session addInput:self.inputVideo];
    }
    if ([self.session canAddOutput:self.output]) {
        [self.session addOutput:self.output];
    }
    // 添加一個預(yù)覽的圖層
    AVCaptureVideoPreviewLayer *prelayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    prelayer.frame = self.view.bounds;
//    [self.view.layer addSublayer:prelayer];
    [self.view.layer insertSublayer:prelayer atIndex:0];
  1. 開啟加工廠
    [self.session startRunning];
  1. 添加視頻錄制開關(guān)按鈕
  // 視頻錄制的開關(guān)
 - (IBAction)startOrClose:(id)sender {
    if ([self.output isRecording]) {
        // 正在錄制
        [self.output stopRecording];
    } else {
        // 沒有錄制
        // 獲取沙盒路徑,用于存儲
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"錄制的視頻.mov"];
        // 開始錄制
        [self.output startRecordingToOutputFileURL:[NSURL fileURLWithPath:path] recordingDelegate:self];
    }
 }
  1. 監(jiān)聽視頻錄制的進(jìn)度
 #pragma mark - AVCaptureFileOutputRecordingDelegate
  - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error;
{
    NSLog(@"完成錄制");
}
 - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections
{
    NSLog(@"開始錄制");
}

為什么需要做視頻截圖

視頻截圖就是截取視頻播放中的某一幀(關(guān)鍵幀)畫面。
有時候當(dāng)我們觀看視頻的時候遭商,或者觀看直播的時候固灵,看到一些好玩,有趣的畫面需要和朋友進(jìn)行分享的時候劫流,就要用到視頻截圖這個功能了巫玻。
下面,我們一起來看一下如何進(jìn)行視頻截圖祠汇。

如何進(jìn)行視頻截圖

  1. 導(dǎo)入框架
#import <AVFoundation/AVFoundation.h>
  1. 核心代碼
   創(chuàng)建視頻資源對象
     // 1.1獲取資源的url
      NSURL *url = [[NSBundle mainBundle] URLForResource:@"movie.mp4" withExtension:nil];
    
      // 1.2對url進(jìn)行封裝
      AVAsset *asset = [AVAsset assetWithURL:url];

      // 1.創(chuàng)建一個視頻截取的截取器
      AVAssetImageGenerator *generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
    
      // <#int64_t value#>:    截取的時間
      // <#int32_t timescale#>: 每秒播放多少幀
      CMTime time = CMTimeMake(23, 1);
      NSValue *value = [NSValue valueWithCMTime:time];

    [generator generateCGImagesAsynchronouslyForTimes:@[value] completionHandler:^(CMTime requestedTime, CGImageRef  _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
        // UI的更新一定要在主線程進(jìn)行,要不然不能夠時時獲得更新
        dispatch_sync(dispatch_get_main_queue(), ^{
            self.picImageView.image = [UIImage imageWithCGImage:image];
        });
    }];

為什么要進(jìn)行視頻壓縮

通常錄制出來的原視頻都會很大仍秤,如果不壓縮就進(jìn)行上傳,一個是浪費(fèi)用戶的流量可很,二個會造成上傳時間過長诗力,影響用戶體驗。

如何進(jìn)行視頻壓縮

  1. 獲取視頻的位置-------相冊

  2. 創(chuàng)建相冊控制器對象,訪問相冊

// 創(chuàng)建訪問相冊的控制器對象
 UIImagePickerController *picker = [[UIImagePickerController alloc]
init];
  1. 訪問相冊之前,需要判斷是否存在相冊
  // 0. 判斷是否有相冊
  if (![UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{NSLog(@" ");
return;}
  1. 彈出控制器
[self presentViewController:picker animated:YES completion:nil];
  1. 訪問相冊可以通過不同的方式,改變的方法為:
設(shè)置他的資源類型
/**
 UIImagePickerControllerSourceTypePhotoLibrary, //照片庫   UIImagePickerControllerSourceTypeCamera,   //照相機(jī)
 UIImagePickerControllerSourceTypeSavedPhotosAlbum //相冊
*/

 picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
  1. 可以看到,相冊中沒有視頻,這是因為需要設(shè)置 媒體類型才能看到
//  設(shè)置媒體類型
 picker.mediaTypes = [UIImagePickerControlleravailableMediaTypesForSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
  1. 看到視頻后,我們需要拿到該視頻,才能進(jìn)行壓縮操作,所以需要設(shè)置代理
picker.delegate = self;

并且遵守協(xié)議

 @interface ViewController ()  <UINavigationControllerDelegate,UIImagePickerControllerDelegate>
實(shí)現(xiàn)方法:
// MARK: - delegate方法
// 選擇照片或者是視頻時 調(diào)用
// info:  相關(guān)參數(shù)
  - (void)imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;

 // 選擇 取消時 調(diào)用
  - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
  1. 打印代理方法中的info這個參數(shù),可以看到里面包含該視頻的地址, 接收該地址
NSLog(@"%@",info);
NSURL *url = info[UIImagePickerControllerMediaURL];
  1. 視頻壓縮的原理: 把視頻用低質(zhì)量導(dǎo)出
  • 創(chuàng)建視頻資源對象
// asset :資源
 AVAsset *asset = [AVAsset assetWithURL:url];
  • 創(chuàng)建視頻導(dǎo)出會話
/**
 AVAssetExportPresetLowQuality       //低質(zhì)量
 AVAssetExportPresetMediumQuality//中質(zhì)量
 AVAssetExportPresetHighestQuality//高質(zhì)量
*/
//  創(chuàng)建視頻導(dǎo)出會話
// presetName :  視頻導(dǎo)出質(zhì)量

 AVAssetExportSession *session = [AVAssetExportSessionexportSessionWithAsset:asset presetName:AVAssetExportPresetLowQuality];
  • 導(dǎo)出視頻:
//  導(dǎo)出
[session exportAsynchronouslyWithCompletionHandler:^{NSLog(@" ");
}];
  • 導(dǎo)出視頻之前,需要我們確定導(dǎo)出到哪里
獲取沙盒路徑//  
 NSString *filePath =[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"123.mp4"];
//  session.outputURL = [NSURL fileURLWithPath:filePath];
  • 演示視頻導(dǎo)出, 報錯, 查看原因,發(fā)現(xiàn)視頻導(dǎo)出錯的原因是沒有設(shè)置視頻導(dǎo)出的類型根據(jù)屬性介紹,可以看到需要查看session.supportedFileTypes屬性,打印該屬性
 // NSLog(@"%@",session.supportedFileTypes); 
/**
"com.apple.quicktime-movie", quicktime-movie 類型 
"public.mpeg-4"              mp4 類型
*/

  // 視頻導(dǎo)出的文件類型
 session.outputFileType = @"public.mpeg-4";
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末根穷,一起剝皮案震驚了整個濱河市姜骡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屿良,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惫周,死亡現(xiàn)場離奇詭異尘惧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)递递,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門喷橙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啥么,“玉大人,你說我怎么就攤上這事贰逾⌒伲” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵疙剑,是天一觀的道長氯迂。 經(jīng)常有香客問我,道長言缤,這世上最難降的妖魔是什么嚼蚀? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮管挟,結(jié)果婚禮上轿曙,老公的妹妹穿的比我還像新娘。我一直安慰自己僻孝,他們只是感情好导帝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著穿铆,像睡著了一般舟扎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悴务,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天睹限,我揣著相機(jī)與錄音,去河邊找鬼讯檐。 笑死羡疗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的别洪。 我是一名探鬼主播叨恨,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挖垛!你這毒婦竟也來了痒钝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痢毒,失蹤者是張志新(化名)和其女友劉穎送矩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哪替,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栋荸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌块。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡爱沟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匆背,到底是詐尸還是另有隱情呼伸,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布钝尸,位于F島的核電站括享,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蝶怔。R本人自食惡果不足惜奶浦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踢星。 院中可真熱鬧澳叉,春花似錦、人聲如沸沐悦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藏否。三九已至瓶殃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間副签,已是汗流浹背遥椿。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淆储,地道東北人冠场。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像本砰,于是被迫代替她去往敵國和親碴裙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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