导出与预览层匹配大小的AVCaptureSession视频

9

我正在使用 AVCaptureSession 和会话预设 AVCaptureSessionPreset640x480 来录制视频。在录制过程中,我使用了一个非标准尺寸(300 x 300)的 AVCaptureVideoPreviewLayer 并将其重力设置为 aspect fill。配置如下:

self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
_previewLayer.frame = _previewView.bounds; // 300 x 300
[_previewView.layer addSublayer:_previewLayer];

录制完视频后,我想将其以QuickTime格式写入文件。在播放期间,我再次在一个300 x 300的非标准大小图层中播放视频。由于这些视频最终将通过网络连接传输,保留完整的640x480视频似乎是浪费的。

如何最好地导出视频以匹配我的300 x 300预览图层?我是AVFoundation的新手,所以如果我做错了,请告诉我。我只想在录制期间将录制的视频显示在预览图层中,以匹配在磁盘上导出的视频。

我认为这个答案应该会对你有所帮助。 - arunit21
1个回答

13

视频分辨率和视频大小是两个不同的概念。分辨率代表清晰度,分辨率越高意味着清晰度越高。而视频大小则是显示视频的界限。根据视频的分辨率和长宽比,当在观看器中查看时,视频将会被拉伸或缩小。

现在,既然事实已经解释清楚了,你可以在这里找到你的答案:

如何使用AVFoundation裁剪视频

按照以下顺序执行步骤:

  1. 将视频录制到磁盘上。
  2. 从磁盘保存到资产库中。
  3. 从磁盘中删除视频。
  4. 按照上面链接中提到的步骤执行操作。

注意:在录制并将视频写入资产库后,执行这些步骤,saveComposition 是已保存的资产。

在此步骤中提供您的大小:videoComposition.renderSize = CGSizeMake(320, 240);,改为videoComposition.renderSize = CGSizeMake(300, 300);

另外建议,由于将文件写入磁盘,然后保存到库中,然后再次写回磁盘是一种比较冗长的操作。尝试使用dispatch_queueoperationBlock异步进行所有操作。

祝您好运!


我会将此标记为最佳答案,因为它很有帮助,但我仍然无法使链接的裁剪代码正常工作。 - user2393462435
你完全无法裁剪视频吗?有什么问题吗? - devluv
1
我需要强制预览层中的实时视频具有特定的分辨率,这取决于设备的屏幕尺寸,因为我在实时视频上有一个叠加层显示标记,该标记直接依赖于每个帧的分辨率,我不希望它被拉伸。是否有一种方法可以强制视频具有特定的分辨率? - Fawkes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接