ios - 裁剪录制的视频帧

标签 ios objective-c avfoundation avassetwriter avvideocomposition

我正在尝试裁剪视频帧。我使用 AVFoundation 框架录制了视频。我需要将拍摄的图像和录制的视频裁剪成正方形。我已经为 UIImage 完成了这项工作,现在我正在尝试裁剪视频。

- (UIImage *)squareImageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
  // Cropping UIImage is working fine.
  CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(0,0, image.size.width, image.size.width));
  UIImage *result = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation];
  CGImageRelease(imageRef);
  return result;
}

我尝试裁剪视频,但结果是在没有裁剪的情况下更改了整个视频帧,而且看起来被拉伸(stretch)了。

_writer = [AVAssetWriter assetWriterWithURL:url fileType:AVFileTypeQuickTimeMovie error:nil];
NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          AVVideoCodecH264, AVVideoCodecKey,
                          [NSNumber numberWithInt: 320], AVVideoWidthKey,
                          [NSNumber numberWithInt: 320], AVVideoHeightKey,
                          nil];
_videoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:settings];
[_writer addInput:_videoInput];

有人可以帮我解决视频裁剪问题吗?提前致谢。

最佳答案

下面是我用于裁剪视频的代码。我们需要设置AVVideoCompressionPropertiesKey,其中包含用于视频设置的AVVideoCleanApertureKey键。

我推荐:How to crop video into square iOS with AVAssetWriter

NSDictionary *videoCleanApertureSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                            [NSNumber numberWithInt:cx], AVVideoCleanApertureWidthKey,
                                            [NSNumber numberWithInt:cx], AVVideoCleanApertureHeightKey,
                                            [NSNumber numberWithInt:10], AVVideoCleanApertureHorizontalOffsetKey,
                                            [NSNumber numberWithInt:10], AVVideoCleanApertureVerticalOffsetKey,
                                            nil];
NSDictionary *videoAspectRatioSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                          [NSNumber numberWithInt:3], AVVideoPixelAspectRatioHorizontalSpacingKey,
                                          [NSNumber numberWithInt:3],AVVideoPixelAspectRatioVerticalSpacingKey,
                                          nil];
NSDictionary *codecSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                               [NSNumber numberWithInt:960000], AVVideoAverageBitRateKey,
                               [NSNumber numberWithInt:1],AVVideoMaxKeyFrameIntervalKey,
                               videoCleanApertureSettings, AVVideoCleanApertureKey,
                               //videoAspectRatioSettings, AVVideoPixelAspectRatioKey,
                               //AVVideoProfileLevelH264Main30, AVVideoProfileLevelKey,
                               nil];
NSString *targetDevice = [[UIDevice currentDevice] model];
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                               AVVideoScalingModeResizeAspectFill,AVVideoScalingModeKey,
                               AVVideoCodecH264, AVVideoCodecKey,
                               codecSettings,AVVideoCompressionPropertiesKey,
                               [NSNumber numberWithInt:cx], AVVideoWidthKey,
                               [NSNumber numberWithInt:cx], AVVideoHeightKey,
                               nil];
_videoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings];

关于ios - 裁剪录制的视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23786292/

相关文章:

objective-c - 单例 - 从数据存储中读取

ios - iOS 9.3 中的 Google+ 正在挂断

objective-c - 使用 iOS Simulator 和 XCode 4 调试应用程序会在 main() 函数中停止,而不是崩溃源

ios - 下载图像并以幻灯片形式显示它们

objective-c - 下面的类函数试图实现什么目的?

iphone - AVMutableCompositionTrack - insertTimeRange - insertEmptyTimeRange 问题

ios - 如何在 iOS 中将 Vignette CIFilter 应用到实时摄像头源?

objective-c - 我们可以在 AVFoundation 中合并两个视频来实现暂停和播放功能吗

iphone - iPhone 中的 AVAudioPlayer prepareToPlay 回调

ios - 将 iOS native 库绑定(bind)到 Xamarin 项目中