一两入、問題描述
線上工單:用戶反饋净宵,系統(tǒng)相冊(cè)的視頻 導(dǎo)入發(fā)布 視頻出現(xiàn)藍(lán)屏的問題,視頻有聲音裹纳,但畫面藍(lán)屏择葡。
反復(fù)協(xié)調(diào)溝通之后,分析問題復(fù)現(xiàn)場(chǎng)景是:
1剃氧、iPhone12用相機(jī)拍攝視頻(方向LandscapeRight
敏储,其他方向不會(huì)有問題),并且iPhone12上App發(fā)布才會(huì)藍(lán)屏朋鞍。
2已添、原視頻放到非iPhone12手機(jī),App版本號(hào)一樣滥酥,也不會(huì)由此問題更舞。
有了問題復(fù)現(xiàn)場(chǎng)景,那就找設(shè)備了坎吻±虏酰可惜公司測(cè)試設(shè)備沒有,最后溝通其他部分禾怠,發(fā)現(xiàn)有把iPhone12手機(jī)。設(shè)備有了贝搁,那就分析開搞了吗氏。
二、分析雷逆、定位
2.1弦讽、實(shí)現(xiàn)代碼邏輯
- 1、使用
AVAssetExportSession
導(dǎo)出MP4
視頻格式膀哲。 - 2往产、獲取視頻的方向,需要對(duì)不同方向做些修正某宪。
- 3仿村、針對(duì)
Portrait 90
、LandscapeLeft 180
兴喂、PortraitUpsideDown 270
角度(分別對(duì)應(yīng)不同的角度拍攝的適配)的視頻蔼囊,重新設(shè)置AVAssetExportSession.videoComposition(AVVideoComposition)
屬性焚志,核心就是利用CGAffineTransformRotate
做transform的變換角度。 - 4畏鼓、調(diào)用
exportAsynchronouslyWithCompletionHandler:
轉(zhuǎn)化輸出酱酬。
2.2、嘗試解決
代碼跟蹤云矫,exportAsynchronouslyWithCompletionHandler:
的回調(diào)里膳沽,AVAssetExportSessionStatus status = [exportSession status];
,并沒有返回失敗让禀,返回AVAssetExportSessionStatusCompleted
也就是轉(zhuǎn)成功挑社。
問題出現(xiàn)在哪里?
把同一個(gè)「異常視頻」在iPhone12 和 非iPhone12 發(fā)布的視頻堆缘,對(duì)比發(fā)現(xiàn)滔灶。iPhone12發(fā)布的視頻bitrate偏小,這應(yīng)該是導(dǎo)致問題原因吼肥。
分析問題的解決方案:
解決辦法1:
嘗試使用項(xiàng)目其他地方录平,使用開源庫(kù)SDAVAssetExportSession
,其允許指定birtate的壓縮轉(zhuǎn)碼缀皱。
結(jié)果是正常的斗这,第三方庫(kù)能正確轉(zhuǎn)碼,不會(huì)導(dǎo)致藍(lán)屏問題啤斗。-
解決辦法2:
突然替換為第三方庫(kù)表箭,不是一種明智的選擇,看發(fā)版還有些時(shí)間钮莲,那就在折騰折騰了免钻。查閱相關(guān)資料中,
AVAssetExportSession
并不能直接設(shè)置bitrate
屬性崔拥,對(duì)比了AVAssetExportSession
屬性极舔,也沒有發(fā)現(xiàn)啥有用的線索×赐撸看代碼拆魏,在初始化AVAssetExportSession
的時(shí)候,AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];
慈俯,使用中等分辨率AVAssetExportPresetMediumQuality
渤刃,嘗試AVAssetExportPresetHighestQuality
發(fā)現(xiàn)頁(yè)不行。突然記起贴膘,之前也有藍(lán)屏的問題卖子,那時(shí)候是因?yàn)樾D(zhuǎn)角度的問題,然道也是同樣的問題嗎刑峡?看代碼揪胃,并沒有針對(duì)
LandscapeRight
做旋轉(zhuǎn)璃哟。
那么會(huì)不會(huì)iPhone12手機(jī)真的視頻方向判斷有差異呢?
嘗試想其他角度旋轉(zhuǎn)處理一樣喊递,重新設(shè)置AVAssetExportSession.videoComposition(AVVideoComposition)
屬性随闪,變換角度CGAffineTransformIdentity
也就是不做變換。
奇跡出現(xiàn)骚勘,可以了n戆椤!俏讹!
基本上可以確定当宴,是因?yàn)樾D(zhuǎn)角度的問題,可以為什么會(huì)有差異呢泽疆?查了國(guó)內(nèi)外相關(guān)技術(shù)網(wǎng)站户矢,沒發(fā)現(xiàn)有用的線索。今天就要發(fā)版了殉疼,只能寫入筆記梯浪,后續(xù)跟蹤了。
2.3瓢娜、最終解決方案
由于只有在iPhone12手機(jī)上App發(fā)布挂洛,并且「系統(tǒng)相機(jī)」拍攝的 「方向?yàn)長(zhǎng)andscapeRight的視頻」才會(huì)有問題,其他正常眠砾,為了規(guī)避風(fēng)險(xiǎn)虏劲,只針對(duì)iPhone12手機(jī),并且「方向?yàn)長(zhǎng)andscapeRight的視頻」特殊處理褒颈。
- iPhone12真機(jī)判斷
NSString *model = [[UIDevice currentDevice] machineModel];
NSArray *iPhone12_id_list = @[@"iPhone13,1", @"iPhone13,2", @"iPhone13,3", @"iPhone13,4"];
BOOL szy_is_iPhone12 = iPhone12_id_list ? [iPhone12_id_list containsObject:model] : NO;
- 視頻方向的判斷
- (int)degressFromVideoFileWithAsset:(AVAsset *)asset {
int degress = 0;
NSArray *tracks = [asset tracksWithMediaType:AVMediaTypeVideo];
if([tracks count] > 0) {
AVAssetTrack *videoTrack = [tracks objectAtIndex:0];
CGAffineTransform t = videoTrack.preferredTransform;
if(t.a == 0 && t.b == 1.0 && t.c == -1.0 && t.d == 0){
// Portrait
degress = 90;
} else if(t.a == 0 && t.b == -1.0 && t.c == 1.0 && t.d == 0){
// PortraitUpsideDown
degress = 270;
} else if(t.a == 1.0 && t.b == 0 && t.c == 0 && t.d == 1.0){
// LandscapeRight
degress = 0;
} else if(t.a == -1.0 && t.b == 0 && t.c == 0 && t.d == -1.0){
// LandscapeLeft
degress = 180;
}
}
return degress;
}
三柒巫、寫在最后
工單的排查,往往困難重重谷丸,需要客戶空間堡掏、時(shí)間上與客戶差異溝通問題。線索的收集更是不容易淤井。溝通中也會(huì)有很多障礙布疼。
這一一切困難摊趾,還是本著職業(yè)精神币狠、客戶至上精神,克服吧砾层。及時(shí)問題解決不了漩绵,你也可以從中學(xué)到很多。
針對(duì)視頻相關(guān)類AVAssetExportSession
肛炮、AVAsset
止吐、AVAssetTrack
宝踪、AVVideoComposition
、AVMutableVideoCompositionInstruction
等與編碼有關(guān)的碍扔,后續(xù)還是要好好總結(jié)瘩燥。