移動開發 透明視頻那些事

語言用的是OC 所以平臺是IOS

在手機上想要播放一段透明背景視頻其實無非就只有兩種模式(其實電腦上也一樣):

第一種方法.把透明通道壓制到原視頻內部,變成另外一段“真正”的透明視頻,但帶來的問題是視頻體積輻射狀態擴大。嘗試壓制了一段2M4秒的透明背景AVI,體積變成了1G。

當然這部分工作也可以通過代碼實現,比如AVAnimator:

NSString*rgbResourceName;

NSString*alphaResourceName;

NSString*rgbTmpMvidFilename;

NSString*rgbTmpMvidPath;

rgbResourceName =@"MarioRendered_960_640_rgb_CRF_20_24BPP.m4v";

alphaResourceName =@"MarioRendered_960_640_alpha_CRF_20_24BPP.m4v";

rgbTmpMvidFilename =@"MarioRendered.mvid";

rgbTmpMvidPath = [AVFileUtilgetTmpDirPath:rgbTmpMvidFilename];

NSLog(@"loading %@", rgbTmpMvidPath);

AVAnimatorMedia*media = [AVAnimatorMediaaVAnimatorMedia];

self.marioMedia= media;

AVAssetJoinAlphaResourceLoader*resLoader = [AVAssetJoinAlphaResourceLoaderaVAssetJoinAlphaResourceLoader];

resLoader.movieRGBFilename= rgbResourceName;

resLoader.movieAlphaFilename= alphaResourceName;

resLoader.outPath= rgbTmpMvidPath;

resLoader.alwaysGenerateAdler=TRUE;

media.resourceLoader= resLoader;

AVMvidFrameDecoder*frameDecoder = [AVMvidFrameDecoderaVMvidFrameDecoder];

media.frameDecoder= frameDecoder;

media變成了一段內含透明通道的真正透明視頻。


第二種方法·通過實時渲染把背景綠幕或其他幕透明化,這種事情一般都是GPU處理,比如GPUImage

GPUImageChromaKeyBlendFilter*filter = [[GPUImageChromaKeyBlendFilteralloc]init];

[filtersetColorToReplaceRed:0.0green:1.0blue:0.0];

[filtersetThresholdSensitivity:0.4];

[movieFileaddTarget:filter];

#if defined(GPUIMAGEWORKAROUND)

//NSString *resFilename = @"checkerboard_background.png";

NSString*resFilename =@"empty.png";

UIImage*inputImage = [UIImageimageNamed:resFilename];

GPUImagePicture*sourcePicture = [[GPUImagePicturealloc]initWithImage:inputImagesmoothlyScaleOutput:YES];

[sourcePictureaddTarget:filter];

self.sourcePicture= sourcePicture;

#else

#endif// GPUIMAGEWORKAROUND

[filteraddTarget:self.marioView];

self.marioView.fillMode=kGPUImageFillModeStretch;

self.movieFile= movieFile;

self.filter= filter;


前一種情況是app容量劇增,后一種情況是GPU使用不能沖突

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容