iOS:抖音短視頻生成webp動(dòng)圖客戶端解決方案

前言


最近要求做一個(gè)類似抖音將短視頻生成動(dòng)圖在列表進(jìn)行展示的需求,生成動(dòng)圖最大的好處是用戶在列表能夠最直觀地預(yù)覽到短視頻的大致內(nèi)容跨算,雖然這個(gè)是個(gè)用戶體驗(yàn)的加分項(xiàng)哺呜,但是如果我們不能處理好圖片占用空間及清晰度問(wèn)題蜘澜,也會(huì)帶來(lái)副作用。

那么俭识,我們?cè)撊绾螜?quán)衡呢慨削?

Gif or Webp?

要想使用動(dòng)圖并且圖片足夠小套媚,當(dāng)然是用Webp了缚态,圖1是gif和webp的對(duì)比,可見(jiàn)webp節(jié)省了不少空間玫芦!這里有篇介紹Webp的經(jīng)典文章,有興趣的朋友可以了解下:濃縮的精華本辐!從零開(kāi)始帶你認(rèn)識(shí)最新的圖片格式WEBP桥帆。


圖1

截取視頻幀

截取視頻一幀關(guān)鍵代碼如下:

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

generator.appliesPreferredTrackTransform = YES;

//下面兩個(gè)值設(shè)為0表示精確取幀,否則系統(tǒng)會(huì)有優(yōu)化取出來(lái)的幀時(shí)間間隔不對(duì)等

generator.requestedTimeToleranceAfter = kCMTimeZero;

generator.requestedTimeToleranceBefore = kCMTimeZero;

生成Webp

這里推薦一個(gè)功能強(qiáng)大的iOS 圖像框架:YYImage慎皱。

使用YYImageEncoder可以很方便的生成gif或webp動(dòng)圖,實(shí)例代碼:

YYImageEncoder *gifEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeWebP];

gifEncoder.loopCount=0;

gifEncoder.quality=0.8;

[gifEncoder addImage:img duration:0.1];

[gifEncoder encodeToFile:filePath];

至此老虫,2個(gè)關(guān)鍵技術(shù)點(diǎn)講完了,不妨試試截取幾幀生成一個(gè)webp試試手......

當(dāng)你驚喜的發(fā)現(xiàn)圖片已經(jīng)生成的同時(shí)茫多,也會(huì)驚訝的發(fā)現(xiàn)圖片占用空間依然很大啊祈匙。

繼續(xù)優(yōu)化

要想盡可能的優(yōu)化圖片空間,只有從兩個(gè)方面入手:

1、盡可能減少圖片幀數(shù)

2夺欲、盡可能壓縮圖片

針對(duì)第一點(diǎn)跪帝,以及參考抖音的效果,我的方案如下:

總共截取9幀圖片些阅,前5幀從視頻的0.5秒開(kāi)始伞剑,每間隔0.1秒截取一幀;然后倒序再截取4幀市埋,從而形成倒序播放的效果黎泣。

針對(duì)第二點(diǎn),首先對(duì)圖片大小按比例進(jìn)行裁剪腰素,以最大邊長(zhǎng)不超過(guò)480為依據(jù)進(jìn)行等比壓縮聘裁,然后設(shè)置0.8的有損壓縮。

最終方案:

- (void)saveToWebpByVideoPath:(NSURL*)videoUrl webpFilePath:(NSString*)webpFilePath{

? ? YYImageEncoder *gifEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeWebP];

? ? gifEncoder.loopCount=0;

? ? gifEncoder.quality=0.8;

? ? AVURLAsset*asset = [[AVURLAssetalloc]initWithURL:videoUrloptions:nil];

? ? int64_t scale = asset.duration.timescale;

? ? AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

? ? generator.appliesPreferredTrackTransform = YES;

? ? //下面兩個(gè)值設(shè)為0表示精確取幀弓千,否則系統(tǒng)會(huì)有優(yōu)化取出來(lái)的幀時(shí)間間隔不對(duì)等

? ? generator.requestedTimeToleranceAfter = kCMTimeZero;

? ? generator.requestedTimeToleranceBefore = kCMTimeZero;

? ? for(inti =0; i <=4; i++) {

? ? ? ? CGFloatstarttime = i*0.1+0.5;

? ? ? ? CMTimetime =CMTimeMakeWithSeconds(starttime, (int)scale);

? ? ? ? NSError*error =nil;

? ? ? ? CMTimeactualTime;

? ? ? ? CGImageRefimage = [generatorcopyCGImageAtTime:timeactualTime:&actualTimeerror:&error];

? ? ? ? UIImage* img = [UIImageimageWithCGImage:image];

? ? ? ? img = [selfresizeToMaxHeight:480img:img];

? ? ? ? [gifEncoderaddImage:imgduration:0.1];

? ? ? ? CGImageRelease(image);

? ? }

? ? for(inti=3; i>=0; i--) {

? ? ? ? CGFloatstarttime = i*0.1+0.5;

? ? ? ? CMTimetime =CMTimeMakeWithSeconds(starttime, (int)scale);

? ? ? ? NSError*error =nil;

? ? ? ? CMTimeactualTime;

? ? ? ? CGImageRefimage = [generatorcopyCGImageAtTime:timeactualTime:&actualTimeerror:&error];

? ? ? ? UIImage* img = [UIImageimageWithCGImage:image];

? ? ? ? img = [selfresizeToMaxHeight:480img:img];

? ? ? ? [gifEncoderaddImage:imgduration:0.1];

? ? ? ? CGImageRelease(image);

? ? }


? ? [gifEncoderencodeToFile:webpFilePath];

? ? NSLog(@"生成webp成功!");

}

- (UIImage*)resizeToMaxHeight:(CGFloat)height img:(UIImage*)img{

? ? if(img.size.width

? ? ? ? if(img.size.height>height) {

? ? ? ? ? ? CGSizenewSize =CGSizeMake(height*1.0*img.size.width/img.size.height, height);

? ? ? ? ? ? img = [imgyy_imageByResizeToSize:newSize contentMode:UIViewContentModeScaleToFill];

? ? ? ? }

? ? }

? ? else{

? ? ? ? if(img.size.width>height) {

? ? ? ? ? ? CGSizenewSize =CGSizeMake(height,img.size.height*height*1.0/img.size.width);

? ? ? ? ? ? img = [imgyy_imageByResizeToSize:newSize contentMode:UIViewContentModeScaleToFill];

? ? ? ? }

? ? }

? ? returnimg;

}

本文為作者原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處献起,如果你覺(jué)得這篇文章對(duì)你有幫助或啟發(fā)洋访,歡迎??或送小禮物

補(bǔ)充:Demo請(qǐng)戳這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谴餐,隨后出現(xiàn)的幾起案子姻政,更是在濱河造成了極大的恐慌,老刑警劉巖岂嗓,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汁展,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡厌殉,警方通過(guò)查閱死者的電腦和手機(jī)食绿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)公罕,“玉大人器紧,你說(shuō)我怎么就攤上這事÷ゾ欤” “怎么了铲汪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)罐柳。 經(jīng)常有香客問(wèn)我掌腰,道長(zhǎng),這世上最難降的妖魔是什么张吉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任齿梁,我火速辦了婚禮,結(jié)果婚禮上芦拿,老公的妹妹穿的比我還像新娘士飒。我一直安慰自己查邢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布酵幕。 她就那樣靜靜地躺著扰藕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芳撒。 梳的紋絲不亂的頭發(fā)上邓深,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音笔刹,去河邊找鬼芥备。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舌菜,可吹牛的內(nèi)容都是我干的萌壳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼日月,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼袱瓮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起爱咬,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尺借,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后精拟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體燎斩,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蜂绎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栅表。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荡碾,死狀恐怖谨读,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坛吁,我是刑警寧澤劳殖,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站拨脉,受9級(jí)特大地震影響哆姻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玫膀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一矛缨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦箕昭、人聲如沸灵妨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泌霍。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谦炒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留藤为,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓夺刑,卻偏偏與公主長(zhǎng)得像缅疟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子性誉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 從視頻中獲取縮略圖生成GIF圖片窿吩,首先需要了解思路和要用到的開(kāi)發(fā)框架,先來(lái)說(shuō)一下思路: 1.在視頻中按一定的時(shí)間错览,...
    輝的書(shū)閱讀 2,001評(píng)論 0 0
  • 1 圖片處理 1.1 編輯圖片的幾個(gè)方法 第一種 先用UIImage對(duì)象加載一張圖片 然后轉(zhuǎn)化成CGImageRe...
    Kevin_Junbaozi閱讀 1,523評(píng)論 0 7
  • 挑弄花影轉(zhuǎn)朱閣 冰肌玉骨映清波 薄霧濃云細(xì)打磨 還羞澀 一半兒偷窺一半兒遮
    西村1983閱讀 166評(píng)論 0 1
  • 工欲善其事必先利其器,找到一個(gè)好的工具來(lái)協(xié)助我們進(jìn)行管理是十分必要的煌往,下面我就來(lái)記錄一下倾哺,我現(xiàn)在所使用的工具們(會(huì)...
    露蘇維閱讀 210評(píng)論 0 0
  • ubuntu上安裝mysql serversudo apt-get install mysql-server 安裝...
    杜小龍閱讀 566評(píng)論 0 1