Nano Hash - криптовалюты, майнинг, программирование

Двойной выход камеры в iOS

Я хочу сделать двойной экран с помощью встроенной камеры на iOS

Я пробовал следующий код, но он показывает только одно представление.

Это естественный результат, я знаю.

Вот код, который я использовал.

- (void)prepareCameraView:(UIView *)window
{
    AVCaptureSession *session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPresetMedium;

    CALayer *viewLayer = window.layer;
    NSLog(@"viewLayer = %@", viewLayer);

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] 
                                                            initWithSession:session];
    captureVideoPreviewLayer.frame = window.bounds;
    [window.layer addSublayer:captureVideoPreviewLayer];    
    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    NSError *error = nil;
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
    if (!input) 
    {
        NSLog(@"ERROR : trying to open camera : %@", error);
    }

    [session addInput:input];

    [session startRunning];
}

Как я могу получить двойной экран на iOS?


  • Почему вы не можете использовать функцию просмотра наложения камеры в iOS 04.01.2012
  • Возможный дубликат stackoverflow.com/questions/16543075/ 07.08.2014

Ответы:


1

Попробуй это:

- (void)prepareCameraView:(UIView *)window
{
    NSArray *captureDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

    {
        AVCaptureSession *session = [[AVCaptureSession alloc] init];
        session.sessionPreset = AVCaptureSessionPresetMedium;

        CALayer *viewLayer = window.layer;
        NSLog(@"viewLayer = %@", viewLayer);

        AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
        captureVideoPreviewLayer.frame = CGRectMake(0.0f, 0.0f, window.bounds.size.width/2.0f, window.bounds.size.height);
        [window.layer addSublayer:captureVideoPreviewLayer];

        NSError *error = nil;
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:[captureDevices objectAtIndex:0] error:&error];
        if (!input) 
        {
            NSLog(@"ERROR : trying to open camera : %@", error);
        }

        [session addInput:input];

        [session startRunning];
    }

    {
        AVCaptureSession *session = [[AVCaptureSession alloc] init];
        session.sessionPreset = AVCaptureSessionPresetMedium;

        CALayer *viewLayer = window.layer;
        NSLog(@"viewLayer = %@", viewLayer);

        AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
        captureVideoPreviewLayer.frame = CGRectMake(window.bounds.size.width/2.0f, 0.0f, window.bounds.size.width/2.0f, window.bounds.size.height);
        [window.layer addSublayer:captureVideoPreviewLayer];

        NSError *error = nil;
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:[captureDevices objectAtIndex:1] error:&error];
        if (!input) 
        {
            NSLog(@"ERROR : trying to open camera : %@", error);
        }

        [session addInput:input];

        [session startRunning];
    }

}

Обратите внимание, что он абсолютно не проверяет, что на самом деле есть две камеры, и разделяет их по вертикали, так что это, вероятно, лучше всего видно в альбомной ориентации. Вы захотите добавить несколько проверок в этот код и определить, как именно вы хотите расположить слои каждой камеры перед ее использованием.

04.01.2012
  • Если вы запустите этот код, ваш первый сеанс будет немедленно прерван вашим вторым сеансом (при условии, что ваш второй сеанс еще позволяет вам начать добавлять входные данные). Кроме того, этот код не будет компилироваться. 04.01.2012
  • Он компилируется для меня. И что вы имеете в виду, говоря, что первая сессия прерывается немедленно? Вы уверены? Честно говоря, я на самом деле не пробовал это должным образом, но я не понимаю, почему это не сработает. 04.01.2012
  • Он компилируется для вас, потому что вы отредактировали так, чтобы он :p и да, я уверен. Вы не можете запускать два сеанса захвата видео одновременно. Либо первый получит уведомление о прерывании, либо второй не запустится, в зависимости от того, что медиасервер решит с вами сделать. 04.01.2012
  • mattjgalloway, ваш ответ очень приветствуется, но это не работает. Джейсон Коко прав. Но я очень ценю ваш ответ ^^ 04.01.2012
  • @JasonCoco, как насчет приложения FaceTime? Как можно показать два сеанса захвата видео? 04.01.2012
  • Приложение FaceTime не показывает два сеанса захвата видео. Он остановит сеанс, изменит входные данные, запустит его снова. Извиняюсь за то, что думал, что 2 сеанса сработают, я мог бы поклясться, что делал это раньше, но, очевидно, нет! 04.01.2012
  • @J.KJeon Приложение FaceTime не снимает видео с обеих камер одновременно. Он берет видео с одного или другого, использует один сеанс и управляет несколькими входами (однако одновременно будет работать только один видеопоток с камеры на устройстве). Другое изображение представляет собой наложенный видеопоток с другого устройства, что вполне возможно. Я предлагаю вам использовать ответ Мэтта в качестве отправной точки. Вы сможете пройти большую часть пути, просто прочитав материал AVFoundation. Я предлагаю вам также взглянуть на класс AVCaptureVideoDataOutput... в нем есть ссылки на приличный пример кода. 04.01.2012
  • @mattjgalloway, вам не нужно извиняться ^^ Это действительно тяжелая работа — сделать двойной видеоэкран. Я не думаю, что нет никакого способа, но я не знаю, как. 04.01.2012
  • @JasonCoco, твои ответы очень полезны!! Я признателен за это !! 04.01.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..