Swift 4 ile VideoSıkıştırma

Herkese merhabaarkadaşlar。 Bildiğinizüzerediğerdillerdeolduğugibi Swift’e de ait internette pek fazlaTürkçekaynakbulamamaktayız。 您可以在olmakadınakendi projemdekullanmışolduğumvegerçektenişeyarayacağınıdüşündüğümbir konuyla seriyebaşlamışbulundum。

Başlıktandaanlaşılacağıüzerebugün视频sıkıştırmadanbahsedeceğiz。 您可以在磁盘上找到磁盘,然后在磁盘上添加文件。yaptıysanızkeinlikleihtiyaçduyacaksınız。 Ayrıcabildiğinizgibiyüksekboyuttakivideolarıuzunsürelerde上传了etme durumudasözkonusu。 Birdakikalıkbir videonun ortalama 100 MBdolaylarındaolduğunudüşünürsekkullanıcılarınızsizikötüanmasımuhtemelenkaçınılmazolacaktır。

视频sıkıştırmaylailgilibirçok算法mevcut fakat buyazıdaAVFoundation’ıniçindebulunan AVAssetExportSession kullanarak buişlemigerçekleştirececeiz。 Sıkıştırmadanziyadeküçültmedediyebiliriz :)。

Buişlemibir fonksiyoniçerisindegerçekleştireceğiz。 FonksiyonagöndereceğimizinputURL(Videomuzunbulunduğukonumun adresi。路径olaraktatanımlanabilir。)ve outputURL (Sıkışmasonucunda almakistediğimizkonumun adresi。)olacak。

Fonksiyonumuzuoluşturmayabaşlayabiliriz。

  func compressVideo(inputURL:URL,outputURL:URL,handler:@escaping(_ exportSession:AVAssetExportSession?)->无效){ 
  } 

Yukarıdakigibi compressVideoadındabir fonksiyonoluşturduk。 3 adetdeğervar输入ve输出URL’leri ve bir adet handlerimiz。 否否输出否否是kullandığımızdanyukarıdabahsetmiştik。 handlerimiziniçindebir @转义ekintanımladık。 Bunun nedeni fonksiyonumuzadışarıdanmüdahalegeldiğindedeğişiklikveyayüklemeyapmayakalktığımızdabir hataylakarşılaşmamak。 阿丁(Ardından)逃离了AVFoundation(国际电影基金会)AVAssetExportSession’ıkullanarak exportSessionadındabir export oturumutanımlıyoruz。

AVAssetExportSession’u kullanmakiçinAVFoundation’ısınıfınıza导入etmelisiniz。

Fonksiyonumuzuniçinidoldurmayabaşlayabiliriz。

  let urlAsset = AVURLAsset(URL:inputURL,选项:无) 
 保护卫队exportSession = AVAssetExportSession(asset:urlAsset,presetName:AVAssetExportPresetMediumQuality)else { 
 处理程序(无) 
 返回 
  } 

GirişvarlığımızıbelirtmekadınaurlAssetadındanoluşturduğumuzdeğişkeneAVURLAsset fonsiyonunuçağırarakurlkısmınıninputURL’imiziolduğunutanımladık。 ArdındanexportSessionadındakideğişkenimiziAVAssetExportSession fonksiyonuzu kullanarak bir oturumoluşturduk。 bu yourum bizimvideolarımızınçıktısınısağlayacağımızdeğişken。 AVAssetExportSession bizden 2版本。 Birincisi资产ikinciside预设名称。 资产kísmınaoluşturmuşolduğumuzurlAssetdeğişkenini预设名称kísmınaise Videomuzunçıktısınıalacağımızkaliteyitanımladık。 AVAssetExportPresetMediumQuality ifadeettiğimizgibi bizim videomuzun kalitesinibelirlediğimizkısım。 Yaniçıkışındanasılbir kalitedeolmasıgerektiğiniifade etmemiz gerekiyor。 Sizaşağıdagörüldüğügibifarklı预设为“ lardatanımlayabilirsiniz”。 Amaunutmamalıyızki kalite ne kadar artarsaküçültmeoranıdao kadardüşer。 Ben buradaörnekolarak中等kullandım。

Peki neden后卫让?

Fonksiyonumuzdagördüğünüzgibi exportSessiondeğişkenimizi后卫olaraktanımladık。 Bunun sebebi isedışarıdanboşbir video urlsi gelme durumundaboşbir handlerçağırmak。

儿子kısım

Videoküçültmeişlemimizin儿子kısmındaiseaşağıdagördüğünüzifadelerikullanacağız。

  exportSession.outputURL = outputURL 
  exportSession.outputFileType = AVFileType.mp4 
  exportSession.exportAsynchronously {()->在 
 处理程序(exportSession) 
 打印(“视频küçültmeişlemitamamlandı!”) 
  } 

Çıkışoturumumuzutanımladıkfakathenüzişlemimizitamamlamışdeğiliz。 YukarıdagördüğünüzgibiexportSession’ımızınçıkışadvesi ve tipini belirtmemiz gerekiyor。 输出网址kısmınıfonksiyonuçağırdığımızdaverilecek olan videonunçıkışadresineeşitliyoruz。 ArdındanoutputFileTypekısmındaanlaşıldığıüzerenetürçıkışalmakistiyorsanızbelirtiyoruz。

Yukarıdagördüğünüzgibi sizfarklıformatlardaseçebilirsinizben MP4 olaraktanımladım。

Ve son olarak export异步同步ifadesini exportumuzun asenkronolmasıiçintanımladık。 ArdındanhandlerımızınexportSessionolduğunutanımlıyoruzve fonksiyonuzçağırdığımızda“ Videoküçültmeişlemitamamlandı!” ifadesiylekarşılaşıyoruz:)。

Fonksiyonuntamamı:

  func compressVideo(inputURL:URL,outputURL:URL,handler:@escaping(_ exportSession:AVAssetExportSession?)->无效){ 
  let urlAsset = AVURLAsset(URL:inputURL,选项:无) 
 保护卫队exportSession = AVAssetExportSession(asset:urlAsset,presetName:AVAssetExportPresetMediumQuality)else { 
 处理程序(无) 
 返回 
  } 
  exportSession.outputURL = outputURL 
  exportSession.outputFileType = AVFileType.mp4 
  exportSession.shouldOptimizeForNetworkUse = true 
  exportSession.exportAsynchronously {()->在 
 处理程序(exportSession) 
 打印(“ Tamamenıkıştıads”) 
  } 
  } 
  } 

Buyazımburada sona erdi。 Sürç-iLisan eylediysem affola。 Herhangi bir sorunuzda benimleiletişimkurabilirsiniz。 Başkayazılardagörüşmeküzere:)。