- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在渲染一个小于输出大小但工作正常的视频轨道。我想将 UIImage 绘制到背景中,以便视频位于顶部,图像显示在视频不在的区域。我尝试将 CoreAnimation Layers 与 videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:inLayer 一起使用: 但是视频层下面的层似乎没有显示出来(上面的层显示得很好) - 只是黑色或我在 AVMutableVideoCompositionInstruction 对象上设置的任何背景颜色。我也试过将该背景颜色设置为 [UIColor clearColor].CGColor 但它只是以黑色显示。
有人做过类似的事情并有建议吗?
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
CALayer *backgroundLayer = [CALayer layer];
backgroundLayer.frame = rect;
parentLayer.frame = rect;
videoLayer.frame = rect;
videoLayer.backgroundColor = [UIColor clearColor].CGColor;
backgroundLayer.backgroundColor = [UIColor purpleColor].CGColor;
[parentLayer addSublayer:backgroundLayer];
[parentLayer addSublayer:videoLayer];
mainCompositionInst.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
最佳答案
在尝试了几种方法之后,我终于找到了解决方法。要使其正常工作,需要使用空白视频/音频轨道。然后将背景图像叠加到这个空白视频层。然后将其导出并将原始 Assets (视频)和导出的 Assets ( Assets )合并并导出最终 Assets (视频)。希望对您有所帮助。
添加叠加层
- (void)addOverlayImage:(UIImage *)overlayImage ToVideo:(AVMutableVideoComposition *)composition inSize:(CGSize)size {
// 1 - set up the overlay
CALayer *overlayLayer = [CALayer layer];
[overlayLayer setContents:(id)[overlayImage CGImage]];
overlayLayer.frame = CGRectMake(0, 0, size.width, size.height);
[overlayLayer setMasksToBounds:YES];
// 2 - set up the parent layer
CALayer *parentLayer = [CALayer layer];
CALayer *videoLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, size.width, size.height);
videoLayer.frame = CGRectMake(0, 0, size.width, size.height);
[parentLayer addSublayer:videoLayer];
[parentLayer addSublayer:overlayLayer];
// 3 - apply magic
composition.animationTool = [AVVideoCompositionCoreAnimationTool
videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
}
- (void)getBackgroundVideoAssetWithcompletion:(void (^)(AVAsset *bgAsset))completionBlock {
NSString *path = [[NSBundle mainBundle] pathForResource:@"blank_video" ofType:@"mp4"];
NSURL *trackUrl = [NSURL fileURLWithPath:path];
AVAsset *asset = [AVAsset assetWithURL:trackUrl];
AVAssetTrack *track = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
CMTimeRange range = CMTimeRangeMake(kCMTimeZero, [asset duration]);
AVMutableComposition* mixComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:range ofTrack:[[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
CGAffineTransform videoTransform = track.preferredTransform;
CGSize naturalSize = CGSizeApplyAffineTransform(track.naturalSize, videoTransform);
naturalSize = CGSizeMake(fabs(naturalSize.width), fabs(naturalSize.height));
AVMutableVideoComposition *composition = [AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:asset];
UIImage *img = [self imageWithImage:[UIImage imageNamed:@"white_image"] convertToSize:naturalSize];
[self addOverlayImage:img ToVideo:composition inSize:naturalSize];
AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.timeRange = range;
composition.instructions = @[instruction];
AVAssetExportSession *_assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality];
_assetExport.videoComposition = composition;
NSString *exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"exported-%d.mov", arc4random() % 100000]];
unlink([exportPath UTF8String]);
NSURL *exportUrl = [NSURL fileURLWithPath:exportPath];
_assetExport.outputFileType = AVFileTypeQuickTimeMovie;
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;
[_assetExport exportAsynchronouslyWithCompletionHandler:^{
switch (_assetExport.status) {
case AVAssetExportSessionStatusFailed:
break;
case AVAssetExportSessionStatusExporting:
break;
case AVAssetExportSessionStatusCompleted:{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Successful!!!");
AVAsset *finalAsset = [AVAsset assetWithURL:_assetExport.outputURL];
completionBlock(finalAsset);
});
}
break;
default:
break;
}
}];
}
现在有一个带有叠加图像的视频 Assets 。唯一剩下的就是将原始视频和导出的视频 Assets 结合起来。导出的 Assets 应该是底层,原始 Assets 应该是顶层。
关于ios - 视频轨道后面的 AVFoundation UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18689861/
我想使用 Orbited 进行聊天。我还找到了 Orbited2。有什么不同? Orbited 死了没有?我想用solid solution,不用担心会被关闭或不支持。我还没有找到任何关于 Orbit
我最近开始学习SFML,我有一个问题,如何使第二个物体在轨道上运动,请帮助。 #include using namespace sf; int main() { RenderWindow wi
我正在尝试使用 Tweepy 获取所有带有关键字的推文,但它没有返回某些关键字的任何内容。例如,如果使用 Obama 作为关键字,我会收到很多推文,如果我使用 Arduino,我不会收到任何返回信息,
在我看来,我有一个复选框和一个标签。我正在使用 SLIM,所以代码是 = check_box_tag 'All Products' = label_tag 'All Products' 生成的等效 H
正如倾斜所暗示的那样,我试图弄清楚如何嵌入 soundcloud 文件,以及如何轻松更改嵌入的声音.. 我有一个网站,目前,让用户写一个故事,然后附加一个图像或视频。对于视频,我使用 vimeo 和
我创建了一个在应用程序的实际背景上绘制的 slider 轨道,并且还绘制了 UISlider 拇指图像。我知道如何设置 slider 的缩略图。但如何隐藏 UISlider 轨道呢? 最佳答案 如果你
从 HTTP 链接下载的 Windows Media DRM 轨道是否可以合法渐进播放? 我已经设法在没有 DRM 的情况下做到了这一点,但这里有人告诉我,使用 DRM 是不可能的。这是真的? 如果是
我有一个简单的 vtt 轨道文件编辑器,其中构建的 vtt 文件内容保存在 var vtt 中. 目前我通过保存vtt的内容来添加轨道。到文件,然后将文件读取为 我想省略保存到文件的步骤,直接将变量
我有一个简单的应用程序,用户可以在其中的文本字段中输入内容以获得各种结果。我想要一个功能,如果用户输入某些内容然后关闭浏览器选项卡,下次他们来时,我可以向他们展示他们之前/最近的搜索。即使他们关闭整个
我试图在不同的线程中同时运行 4 个 MP3 轨道。我正在使用 JLayer1.0 MP3 library播放 MP3。鉴于我无法控制线程何时启动,我使用 CountDownLatch 至少让它们同时
我可以在我的 Android 应用程序中播放来自 SoundCloud 的轨道吗?我正在尝试这段代码,但它不起作用: String res = "https://api.soundcloud.com/
我正在使用 Apple Music API 的 recent played endpoint返回最近播放的媒体 Assets 列表。 然后我使用其中之一并在 MPMusicPlayerControll
我正在使用 Foundation Orbit slider 。它工作正常,只是我需要将一些 css(移动标题)应用于页面上的特定 slider 。 如果我使用以下选择器,它会进行更改,唯一的问题是它是
我最难搞清楚如何在 Foundation 的 Orbit slider 中制作两个文本元素和一个按钮。对于这样的初学者问题,我深表歉意,但我是 Foundation 的新手,有些语法让我感到困惑。 这
我需要来自 SoundCloud 的“最流行”或“ HitTest 门的轨道”,但我找不到任何方法来做到这一点。我可以从 http://api.soundcloud.com/tracks?filter
我刚刚从 Rails 3.2 切换到 Rails 4。我正在努力确保我尽可能了解安全问题,并且我现在担心 session 。看起来 Rails 4 已经不再支持除基于 cookie 的 session
我正在开发一个应用程序,用户可以在其中流式传输或下载视频。我使用 ExoPlayer 2.9.6 实现了相同的功能。目前,在播放下载的内容时,当我尝试切换质量时,它仅显示下载的轨道。我知道它的默认行为
有谁知道制作这样的标题的最佳方法 http://i.imgur.com/NOSF0.png ?我试过使用 Firebug 并实现了这个 http://i.imgur.com/cMB3Y.png但是当我
我正在使用 Zurb 轨道 slider :http://www.zurb.com/playground/jquery_image_slider_plugin 我使用以下设置进行幻灯片放映: $(wi
所以我们在这里:http://greeceinsiders.com/VLASIOS/offcanvas/studio.html 我按照说明在页面中放置轨道 slider ,但这个似乎不起作用。我从其他
我是一名优秀的程序员,十分优秀!