即時通訊_視頻錄制、播放

這段時間做了OA管理類項目—IOS

該項目主要模塊分為:

1、新聞、讀報

2、即時通訊、通訊錄

3、oa操作流程

其中錄制視頻中遇到一些問題、接下來就簡單總結一下。如果有代碼問題希望大家及時提出,本人愿意虛心接受修改。希望能進步!

@property(nonatomic,strong)AVCaptureMovieFileOutput *output;

@property (nonatomic,strong) AVPlayer *player;//播放器對象;

@property (nonatomic,strong) AVPlayerLayer * layer;

@property(nonatomic,strong)NSString * uploadPath;//上傳路徑

1、初始化

//1.創建視頻設備(攝像頭前,后)

NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

//2.初始化一個攝像頭輸入設備(first是后置攝像頭,last是前置攝像頭)

AVCaptureDeviceInput *inputVideo = [AVCaptureDeviceInput deviceInputWithDevice:[devices firstObject] error:NULL];

//3.創建麥克風設備

AVCaptureDevice *deviceAudio = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];

//4.初始化麥克風輸入設備

AVCaptureDeviceInput *inputAudio = [AVCaptureDeviceInput deviceInputWithDevice:deviceAudio error:NULL];

//5.初始化一個movie的文件輸出

AVCaptureMovieFileOutput *output = [[AVCaptureMovieFileOutput alloc] init];

self.output = output; //保存output

//6.初始化一個會話

AVCaptureSession *session = [[AVCaptureSession alloc] init];

session.sessionPreset = AVCaptureSessionPreset640x480;

//7.將輸入輸出設備添加到會話中

if ([session canAddInput:inputVideo]) {

[session addInput:inputVideo];

}

if ([session canAddInput:inputAudio]) {

[session addInput:inputAudio];

}

if ([session canAddOutput:output]) {

[session addOutput:output];

}

//8.創建一個預覽涂層

AVCaptureVideoPreviewLayer *preLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];

preLayer.frame = self.view.frame;

preLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

[self.view.layer addSublayer:preLayer];

[session startRunning];

2、錄制完成轉換為mp4

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error

{

NSLog(@"url === %@",outputFileURL);

// 通過文件的 url 獲取到這個文件的資源

[self showHud];

AVURLAsset *avAsset = [[AVURLAsset alloc] initWithURL:outputFileURL options:nil];

// 用 AVAssetExportSession 這個類來導出資源中的屬性

NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];

// 壓縮視頻

if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality]) { // 導出屬性是否包含低分辨率

// 通過資源(AVURLAsset)來定義 AVAssetExportSession,得到資源屬性來重新打包資源 (AVURLAsset, 將某一些屬性重新定義

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetMediumQuality];

// 設置導出文件的存放路徑

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"yyyy-MM-dd-HH:mm:ss"];

NSDate? ? *date = [[NSDate alloc] init];

//存在臨時temp

NSString *outPutPath=[NSTemporaryDirectory() stringByAppendingString:[NSString stringWithFormat:@"myVideo%@.mp4",[formatter stringFromDate:date]]];

NSURL * outUrl =[NSURL fileURLWithPath:outPutPath];

exportSession.outputURL = outUrl;

// 是否對網絡進行優化

exportSession.shouldOptimizeForNetworkUse = true;

// 轉換成MP4格式

exportSession.outputFileType = AVFileTypeMPEG4;

// 開始導出,導出后執行完成的block

[exportSession exportAsynchronouslyWithCompletionHandler:^{

[self hiddenHud];

// 如果導出的狀態為完成

if ([exportSession status] == AVAssetExportSessionStatusCompleted) {

dispatch_async(dispatch_get_main_queue(), ^{

self.uploadPath = outPutPath;

//完成錄制、開始播放

[self initPlayer:outPutPath];

});

}else if ([exportSession status]==AVAssetExportSessionStatusFailed){

NSLog(@"mp4 export Fail!");

}else if ([exportSession status] == AVAssetExportSessionStatusWaiting){

NSLog(@"wait");

}

}];

}

3、播放視頻

#pragma mark -播放視頻

- (void)initPlayer:(NSString *)path

{

NSURL *? url= [NSURL fileURLWithPath:path];

AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];

_player = [AVPlayer playerWithPlayerItem:item];

_layer = [AVPlayerLayer playerLayerWithPlayer:_player];

_layer.frame = CGRectMake(0, 64, self.view.layer.bounds.size.width, 300*SCREEN_WIDTHSCALE);

_layer.videoGravity = AVLayerVideoGravityResizeAspectFill;

// 顯示播放視頻的視圖層要添加到self.view的視圖層上面

[self.view.layer addSublayer:_layer];

[_player play];

[self addNotification];

}

4、 循環播放-添加通知監聽

-(void)addNotification{

//給AVPlayerItem添加播放完成通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.player.currentItem];

}

- (void)playbackFinished:(NSNotification *)notification

{

// 播放完成后重復播放

// 跳到最新的時間點開始播放

[_player seekToTime:CMTimeMake(0, 1)];

[_player play];

}

-(void)dealloc

{

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

5、縮略圖

#pragma mark - 縮略圖

- (UIImage *)getImage:(NSString *)videoURL

{

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:videoURL] options:nil];

AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];

gen.appliesPreferredTrackTransform = YES;

CMTime time = CMTimeMakeWithSeconds(0.0, 600);

NSError *error = nil;

CMTime actualTime;

CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];

UIImage *thumb = [[UIImage alloc] initWithCGImage:image];

CGImageRelease(image);

return thumb;

}

6、注釋

? 1、如果項目還有android端,在android端錄制的時候 把編碼格式設置為AAC,否則android錄制出來之后在ios端播放不了。

2、在ios9可以使用 AVPlayerViewController進行播放、同時MPMoviePlayerController即將被棄用。

3、小視頻錄制最重要的其實是視頻質量和大小的壓縮和處理。這點我還在學習中...如果哪個朋友有相關的參考資料希望可以分享給我.謝謝。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容