之前公司在做一個(gè)聊天的項(xiàng)目,里面用到了發(fā)送視頻的功能颖御,由于一些視頻是從蘋(píng)果的相冊(cè)里讀取的榄棵,所以拿到的文件比較大,服務(wù)器對(duì)上傳的文件大小有限制,所以就做了視頻壓縮的功能疹鳄,和QQ的壓縮效果一樣(系統(tǒng)自帶的壓縮方法)拧略。FFmpeg雖然強(qiáng)大,但視頻壓縮時(shí)耗時(shí)太長(zhǎng)瘪弓,就選擇了系統(tǒng)方法垫蛆。
核心代碼
/**
* 視頻壓縮
* @param originFilePath 視頻資源的原始路徑
* @param outputPath 輸出路徑
*/
-(void)compressVideoAccroding:(NSURL *)originFilePath withOutputUrl:(NSString *)outputPath
{
//創(chuàng)建一個(gè)由URL標(biāo)識(shí)的代表任何資源的assert對(duì)象
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:originFilePath options:nil];
//轉(zhuǎn)碼配置 建議選擇AVAssetExportPresetMediumQuality
AVAssetExportSession *exportSession= [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
exportSession.shouldOptimizeForNetworkUse = YES;
//設(shè)置視頻轉(zhuǎn)碼輸出路徑
exportSession.outputURL = [NSURL fileURLWithPath:outputPath];
//AVFileTypeMPEG4 文件輸出類(lèi)型,可以更改腺怯,是枚舉類(lèi)型袱饭,官方有提供,更改該值也可以改變視頻的壓縮比例
exportSession.outputFileType = AVFileTypeMPEG4;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
int exportStatus = exportSession.status;
switch (exportStatus)
{
case AVAssetExportSessionStatusFailed:
{
NSError *exportError = exportSession.error;
NSLog (@"轉(zhuǎn)碼失敗 AVAssetExportSessionStatusFailed: %@", exportError);
break;
}
case AVAssetExportSessionStatusCompleted:
{
NSLog(@"視頻轉(zhuǎn)碼成功");
//獲取視頻縮放縮略圖片
NSData * scaleImgData = UIImageJPEGRepresentation(assets.thumbImage, 1.0);
//在這里可以拿到壓縮完的視頻輸出路徑進(jìn)行文件上傳
}
}
}];
}