語言用的是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使用不能沖突