Подтвердить что ты не робот

Сохранение видео в неправильной ориентации AVCaptureSession

Я пытаюсь записать видео (без отображения камеры) и сохранить его. Но сохраняемое видео не сохраняется в правильной ориентации. Я пытался заставить UIViewController быть определенной ориентацией, но это не помогло. Все видеоролики записываются в портрете. Мой код ниже:

session = [[AVCaptureSession alloc] init];
[session beginConfiguration];
session.sessionPreset = AVCaptureSessionPresetHigh;


AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *cam in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo])
{
    if (cam.position == AVCaptureDevicePositionFront)
        device = cam;
}

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

AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];


NSString *outputpathofmovie = [[documentsDirectoryPath stringByAppendingPathComponent:@"RecordedVideo"] stringByAppendingString:@".mp4"];
outputURL = [[NSURL alloc] initFileURLWithPath:outputpathofmovie];

[self deleteTempVideos];

[session addInput:input];
[session addInput:audioInput];
[session commitConfiguration];
[session startRunning];

movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
NSLog(@"%@", movieFileOutput.connections);

AVCaptureConnection *videoConnection = nil;

for ( AVCaptureConnection *connection in [movieFileOutput connections] )
{
    NSLog(@"%@", connection);
    for ( AVCaptureInputPort *port in [connection inputPorts] )
    {
        NSLog(@"%@", port);
        if ( [[port mediaType] isEqual:AVMediaTypeVideo] )
        {
            videoConnection = connection;
        }
    }
}

if([videoConnection isVideoOrientationSupported]) // **Here it is, its always false**
{
    [videoConnection setVideoOrientation:[[UIDevice currentDevice] orientation]];
}

NSLog(@"%@", videoConnection);

[session addOutput:movieFileOutput];
[movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
4b9b3361

Ответ 1

Оказывается, вам нужно добавить ориентацию соединений в AVCaptureMovieFileOutput после ее добавления в сеанс.

session = [[AVCaptureSession alloc] init];
[session beginConfiguration];
session.sessionPreset = AVCaptureSessionPresetHigh;


AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *cam in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo])
{
    if (cam.position == AVCaptureDevicePositionFront)
        device = cam;
}

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

AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectoryPath = [paths objectAtIndex:0];


NSString *outputpathofmovie = [[documentsDirectoryPath stringByAppendingPathComponent:@"RecordedVideo"] stringByAppendingString:@".mp4"];
outputURL = [[NSURL alloc] initFileURLWithPath:outputpathofmovie];

[self deleteTempVideos];

[session addInput:input];
[session addInput:audioInput];
[session commitConfiguration];
[session startRunning];

movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
[session addOutput:movieFileOutput];

AVCaptureConnection *videoConnection = nil;

for ( AVCaptureConnection *connection in [movieFileOutput connections] )
{
    NSLog(@"%@", connection);
    for ( AVCaptureInputPort *port in [connection inputPorts] )
    {
        NSLog(@"%@", port);
        if ( [[port mediaType] isEqual:AVMediaTypeVideo] )
        {
            videoConnection = connection;
        }
    }
}

if([videoConnection isVideoOrientationSupported]) // **Here it is, its always false**
{
    [videoConnection setVideoOrientation:[[UIDevice currentDevice] orientation]];
}

[movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];

Ответ 2

**

Попробуйте изменить ориентацию непосредственно перед началом записи.

**

    if let videoConnection = fileOutput!.connectionWithMediaType(AVMediaTypeVideo) {

    var newOrientation: AVCaptureVideoOrientation?
    switch (UIDevice.currentDevice().orientation) {
    case .Portrait:
        newOrientation = .Portrait
        break
    case .PortraitUpsideDown:
        newOrientation = .PortraitUpsideDown
        break
    case .LandscapeLeft:
        newOrientation = .LandscapeRight
        break
    case .LandscapeRight:
        newOrientation = .LandscapeLeft
        break
    default :
        newOrientation = .Portrait
        break

    }
    self.fileOutput.connectionWithMediaType(AVMediaTypeVideo).videoOrientation = newOrientation!
    self.fileOutput.startRecordingToOutputFileURL(NSURL(fileURLWithPath: filePath!), recordingDelegate: self)
}

, где

var fileOutput : AVCaptureMovieFileOutput!

Ответ 4

Спасибо Destiny Dawn, если кто-нибудь ищет код для Xamarin ios:

AVCaptureConnection videoConnection = null;

foreach(AVCaptureConnection connection in _videoOutput.Connections)
{
    foreach ( AVCaptureInputPort port in connection.InputPorts)
    {
        if (port.MediaType == AVMediaType.Video)
        {
            videoConnection = connection;
            break;
        }
    }
}

if (videoConnection != null) {
    if (videoConnection.SupportsVideoOrientation) {
        videoConnection.VideoOrientation = AVCaptureVideoOrientation.LandscapeRight;
    }
}