我遇到了有关视频捕捉方向的问题。首先是关于voip应用程序,它使用可以传输视频的pjsip。使用AVCapture帧捕获视频。所以当设备方向改变时出现问题,那么我也必须设置avcapture方向。 例如:
capConnection.videoOrientation = AVCaptureVideoOrientationLandscapeLeft;
它工作正常,但我有重复的图像部分。
所以问题是如何摆脱这个重复的图像部分。我已经尝试了这个solution,但它一直在崩溃vImageRotate90_ARGB8888
任何想法如何解决这个问题?
为了自己试一试,你可以获得带有示例项目编译的PJSIP 2.3版视频,并在测试SIP服务器上运行它。
编辑:旋转预览图层并进行缩放。当该设备旋转并发送具有重复边缘的图像时,在接收RTP(视频)流时会发生特定问题。例如,如果iPadA(水平)用iPadB(水平)开始视频通话,则图像很好而且不会重复边缘。但如果iPadA旋转到垂直,那么iPadB会获得这些重复的边缘图像。旋转时注意捕获连接方向设置为当前设备方向。
请注意,预览图层具有AVLayerVideoGravityResize
,但这不会影响传出的视频流。
答案 0 :(得分:0)
两个关键部分是在viewDidLoad中设置autoresizingMask并将captureVideoPreviewLayer.frame调整为self.view.layer.bounds;在willAnimateRotationToInterfaceOrientation。
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
//
// react to device orientation notifications
//
[[NSNotificationCenter defaultCenter] addObserver : self
selector : @selector(deviceOrientationDidChange:)
name : UIDeviceOrientationDidChangeNotification
object : nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
}
- (void) willAnimateRotationToInterfaceOrientation : (UIInterfaceOrientation)toInterfaceOrientation
duration : (NSTimeInterval)duration
{
captureVideoPreviewLayer.frame = self.view.layer.bounds;
[[captureVideoPreviewLayer connection] setVideoOrientation:toInterfaceOrientation];
}
- (void)deviceOrientationDidChange: (NSNotification*)notification
{
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
switch (orientation)
{
case UIDeviceOrientationPortrait:
case UIDeviceOrientationPortraitUpsideDown:
case UIDeviceOrientationLandscapeLeft:
case UIDeviceOrientationLandscapeRight:
currentDeviceOrientation = orientation;
break;
// unsupported?
case UIDeviceOrientationFaceUp:
case UIDeviceOrientationFaceDown:
default:
break;
}
}