【问题标题】:How to change AVCaptureMovieFileOutput video orientation during running session?如何在运行会话期间更改 AVCaptureMovieFileOutput 视频方向?
【发布时间】:2016-10-12 08:32:47
【问题描述】:

我已经编写了一个捕获设备视频输入的代码,到目前为止它工作正常。这是我设置的

// add preview layer
_previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.videoView.layer addSublayer:_previewLayer];

// add movie output
_movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
[_session addOutput:_movieFileOutput];
AVCaptureConnection *movieFileOutputConnection = [_movieFileOutput connectionWithMediaType:AVMediaTypeVideo];
movieFileOutputConnection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation];

// start session
[_session startRunning];

地点:

- (AVCaptureVideoOrientation) videoOrientationFromCurrentDeviceOrientation {
    switch ([[UIApplication sharedApplication] statusBarOrientation]) {
        case UIInterfaceOrientationPortrait: {
            return AVCaptureVideoOrientationPortrait;
        }
        case UIInterfaceOrientationLandscapeLeft: {
            return AVCaptureVideoOrientationLandscapeLeft;
        }
        case UIInterfaceOrientationLandscapeRight: {
            return AVCaptureVideoOrientationLandscapeRight;
        }
        case UIInterfaceOrientationPortraitUpsideDown: {
            return AVCaptureVideoOrientationPortraitUpsideDown;
        }
        case UIInterfaceOrientationUnknown: {
            return 0;
        }
    }
}

现在当界面方向改变时,我希望我的输出也改变,所以我有这个:

- (void) updatePreviewLayer {
    _previewLayer.frame = CGRectMake(0, 0, self.videoView.frame.size.width, self.videoView.frame.size.height);
    _previewLayer.connection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation];
    [_session beginConfiguration];
    AVCaptureConnection *movieFileOutpurConnection = [_movieFileOutput connectionWithMediaType:AVMediaTypeVideo];
    movieFileOutpurConnection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation];
    [_session commitConfiguration];
}

但可惜它不起作用。似乎一旦我第一次在电影输出上设置视频方向,它就保持不变,以后无法更改。因此,如果我以横向模式开始拍摄,然后更改为纵向,则视频对于横向模式可以,但纵向模式会旋转。如果我以纵向模式启动,则与横向模式相同。

有什么方法可以做到这一点吗?

【问题讨论】:

    标签: ios iphone video avfoundation


    【解决方案1】:

    在开始会话之前尝试添加:

    [_movieFileOutput setRecordsVideoOrientationAndMirroringChanges:YES asMetadataTrackForConnection:movieFileOutputConnection];
    

    这个方法的头文件文档使它听起来很像你正在寻找的东西:

    控制电影文件输出是否会创建一个定时元数据轨道来记录样本 反映期间对给定连接的 videoOrientation 和 videoMirrored 属性所做的更改 录音。

    那里有更多有趣的信息,我会全部阅读。

    但是,此方法实际上并不旋转帧,它使用定时元数据来指示播放器在播放时进行旋转,因此可能并非所有播放器都支持此功能。如果这是一个交易破坏者,那么您可以放弃AVCaptureMovieFileOutput,转而使用较低级别的AVCaptureVideoDataOutput + AVAssetWriter 组合,您的videoOrientation 更改实际上会旋转帧,从而导致文件可以在任何播放器中正确播放:

    如果 AVCaptureVideoDataOutput 实例的连接的 videoOrientation 或 videoMirrored 属性设置为 非默认值,输出通过物理旋转和/或翻转应用所需的镜像和方向 采样缓冲区,因为它们通过它。

    附言如果您只更改一个属性,我认为您不需要 beginConfiguration/commitConfiguration 对,因为这是为了将多个修改批处理到一个原子更新中。

    【讨论】:

      【解决方案2】:

      您是否尝试过在更改配置之前暂停会话?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        • 2020-10-18
        相关资源
        最近更新 更多