Swift:一种尺寸的videologging,但尺寸不正确

目标是使用Swift在设备上捕捉全屏video。 在下面的代码中,video捕获看起来是全屏幕(logging相机预览使用全屏幕)时发生的,但是video渲染发生在不同的分辨率。 对于5S具体来说,似乎捕获发生在320x568但渲染发生在320x480

如何捕捉和渲染全屏video?

video拍摄代码:

 private func initPBJVision() { // Store PBJVision in var for convenience let vision = PBJVision.sharedInstance() // Configure PBJVision vision.delegate = self vision.cameraMode = PBJCameraMode.Video vision.cameraOrientation = PBJCameraOrientation.Portrait vision.focusMode = PBJFocusMode.ContinuousAutoFocus vision.outputFormat = PBJOutputFormat.Preset vision.cameraDevice = PBJCameraDevice.Back // Let taps start/pause recording let tapHandler = UITapGestureRecognizer(target: self, action: "doTap:") view.addGestureRecognizer(tapHandler) // Log status print("Configured PBJVision") } private func startCameraPreview() { // Store PBJVision in var for convenience let vision = PBJVision.sharedInstance() // Connect PBJVision camera preview to <videoView> // -- Get preview width let deviceWidth = CGRectGetWidth(view.frame) let deviceHeight = CGRectGetHeight(view.frame) // -- Configure PBJVision's preview layer let previewLayer = vision.previewLayer previewLayer.frame = CGRectMake(0, 0, deviceWidth, deviceHeight) previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill ... } 

video渲染代码:

 func exportVideo(fileUrl: NSURL) { // Create main composition object let videoAsset = AVURLAsset(URL: fileUrl, options: nil) let mainComposition = AVMutableComposition() let compositionVideoTrack = mainComposition.addMutableTrackWithMediaType(AVMediaTypeVideo, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid)) let compositionAudioTrack = mainComposition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID(kCMPersistentTrackID_Invalid)) // -- Extract and apply video & audio tracks to composition let sourceVideoTrack = videoAsset.tracksWithMediaType(AVMediaTypeVideo)[0] let sourceAudioTrack = videoAsset.tracksWithMediaType(AVMediaTypeAudio)[0] do { try compositionVideoTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceVideoTrack, atTime: kCMTimeZero) } catch { print("Error with insertTimeRange. Video error: \(error).") } do { try compositionAudioTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), ofTrack: sourceAudioTrack, atTime: kCMTimeZero) } catch { print("Error with insertTimeRange. Audio error: \(error).") } // Add text to video // -- Create video composition object let renderSize = compositionVideoTrack.naturalSize let videoComposition = AVMutableVideoComposition() videoComposition.renderSize = renderSize videoComposition.frameDuration = CMTimeMake(Int64(1), Int32(videoFrameRate)) // -- Add instruction to video composition object let instruction = AVMutableVideoCompositionInstruction() instruction.timeRange = CMTimeRangeMake(kCMTimeZero, videoAsset.duration) let videoLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: compositionVideoTrack) instruction.layerInstructions = [videoLayerInstruction] videoComposition.instructions = [instruction] // -- Define video frame let videoFrame = CGRectMake(0, 0, renderSize.width, renderSize.height) print("Video Frame: \(videoFrame)") // <-- Prints frame of 320x480 so render size already wrong here ... 

如果我find你的话,似乎你误解了设备屏幕宽度不等于相机预览(和捕获)大小的事实。

您的previewLayervideoGravity属性指示如何在您的图层中展开/合适您的预览。 它不影响捕捉输出。

输出的实际帧大小取决于当前AVCaptureSession sessionPreset属性。 正如我通过阅读PBJVision lib的GitHub存储库可以理解的,它的单例对此有一个setter(叫做captureSessionPreset )。 你可以在你的initPBJVision方法里改变它。

在那里你可以find会话预置的可能值。

试试SDAVAssetExportSession

您可以指定AVVideoWidthKeyAVVideoHeightKey您还可以指定configuration文件AVVideoProfileLevelKeyAVVideoProfileLevelH264HighAutoLevel)以支持某些4k,朋友(Michael Lowin)跟踪该属性,帮助我们改进一些导出质量。