Запись наложения в то же время AVFoundation iOS
Теперь я полностью настраиваю возможность записи видео с использованием рамки AVFoundation
, и все это прекрасно, но теперь я хочу добавить наложение во время записи (также видимое на AVCaptureVideoPreviewLayer
Layer)
Я могу добавить этот объект overlay UIView
к VideoPreviewLayer, но я боюсь, как получить тот же вид, что и на записанном видео. Этот UIView
может содержать что-либо от UILabel
до UIImageView
s.
Ответы
Ответ 1
Я не уверен, что это то, что вы ищете, но я предполагаю, что вы можете использовать графическую библиотеку Brad Larson, есть класс под названием GPUImageElement, который позволяет добавлять наложения и виды. Пожалуйста, ознакомьтесь с примерами, особенно с тем, называемую витриной фильтра и прокрутите к чему-то, называемому UIElement.
Вот пример кода:
else if (filterType == GPUIMAGE_UIELEMENT)
{
GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
blendFilter.mix = 1.0;
NSDate *startTime = [NSDate date];
UILabel *timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 240.0f, 320.0f)];
timeLabel.font = [UIFont systemFontOfSize:17.0f];
timeLabel.text = @"Time: 0.0 s";
timeLabel.textAlignment = UITextAlignmentCenter;
timeLabel.backgroundColor = [UIColor clearColor];
timeLabel.textColor = [UIColor whiteColor];
uiElementInput = [[GPUImageUIElement alloc] initWithView:timeLabel];
[filter addTarget:blendFilter];
[uiElementInput addTarget:blendFilter];
[blendFilter addTarget:filterView];
__unsafe_unretained GPUImageUIElement *weakUIElementInput = uiElementInput;
[filter setFrameProcessingCompletionBlock:^(GPUImageOutput * filter, CMTime frameTime){
timeLabel.text = [NSString stringWithFormat:@"Time: %f s", -[startTime timeIntervalSinceNow]];
[weakUIElementInput update];
}];
}
Ответ 2
Вы хотите наложить UIView
's, но если вы не против использовать CALayer
, вы можете
добавьте свой оверлей после экспорта, используя свойство AVAssetExportSession
AVVideoComposition
. Он имеет свойство AVVideoCompositionCoreAnimationTool *animationTool
, которое позволяет добавить анимацию CALayer
к вашему выводу, хотя я думаю, вам не повезло, если внешний вид оверлея не может быть описан CABasicAnimation
. Ваш пример заголовка отображения может быть возможен, хотя я предполагаю, что что-то простое, как текущий счетчик времени, не будет. Если вы можете жить с этим ограничением, образец кода WWDC 2010 "AVEditDemo" является хорошей отправной точкой.
Если вам нужно больше управления, вы можете вручную визуализировать наложение UIView
на кадры захвата, используя [view.layer renderInContext:contextToThenRenderToFrame]
, а затем записать эти кадры в файл с помощью AVAssetWriter
(как только вы захватите фреймы в память, вы больше не сможете использовать AVCaptureMovieFileOutput
).
Предупреждение: кадры, которые вы снимаете, могут не достигать одинаковой скорости и зависят от окружающего освещения и даже от нагрузки системы. Если ваш оверлей изменяется с большей скоростью, чем захват видео, вам нужно будет повторить кадры во втором решении. Это обрабатывается для вас AVVideoComposition
в первом решении.
P.S. Решение два неудобно, но, не вдаваясь в подробности, iOS7, похоже, сделал это намного проще.
Ответ 3
вы можете найти его в Руководстве по программированию AVFoundation в разделе editing
Существует раздел, посвященный наложению изображения. Я попытаюсь привести пример кода/проекта.
Ответ 4
Для выяснения вашей проблемы есть два очень подробных объяснения на сайте учебника Raywenderlich. Это учебник из двух частей.
Первый здесь: http://www.raywenderlich.com/13418/how-to-play-record-edit-videos-in-ios
Второй здесь: http://www.raywenderlich.com/30200/avfoundation-tutorial-adding-overlays-and-animations-to-videos
Удачи и надежды Это помогает!