Запись наложения в то же время 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

Удачи и надежды Это помогает!