Tag: avvideocomposition

AVPlayer不正确地播放video合成结果

我需要一个简单的东西: 在旋转和应用CIFilter同时播放video。 首先,我创build玩家项目: AVPlayerItem *item = [AVPlayerItem playerItemWithURL:videoURL]; // DEBUG LOGGING AVAssetTrack *track = [[item.asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; NSLog(@"Natural size is: %@", NSStringFromCGSize(track.naturalSize)); NSLog(@"Preffered track transform is: %@", NSStringFromCGAffineTransform(track.preferredTransform)); NSLog(@"Preffered asset transform is: %@", NSStringFromCGAffineTransform(item.asset.preferredTransform)); 然后我需要应用video作品。 最初,我正在考虑用2条指令创build一个AVVideoComposition ,一个是AVVideoCompositionLayerInstruction ,另一个是CIFilter应用程序。 然而,我得到一个exception抛出说: “期望video组成只包含AVCoreImageFilterVideoCompositionInstruction”这意味着苹果不允许结合这两个指令。 所以,我把这两个过滤结合起来,这里是代码: AVAsset *asset = playerItem.asset; CGAffineTransform rotation = [self transformForItem:playerItem]; AVVideoComposition *composition = [AVVideoComposition videoCompositionWithAsset:asset […]

自定义AVVideoCompositing类不按预期方式工作

我正在尝试将CIFilter应用于AVAsset,然后使用应用的filter进行保存。 我这样做的方式是通过使用videoComposition的AVMutableVideoComposition设置为具有自定义AVVideoCompositing类的AVMutableVideoComposition对象。 我还将AVMutableVideoComposition对象的instructions设置为自定义组合指令类(符合AVMutableVideoCompositionInstruction )。 这个类传递一个跟踪ID,以及一些其他不重要的variables。 不幸的是,我遇到了一个问题 – 我的自定义video合成器类(符合AVVideoCompositing )中的startVideoCompositionRequest:函数未被正确调用。 当我将自定义指令类的passthroughTrackIDvariables设置为轨道ID时, startVideoCompositionRequest(request)函数不会被调用。 然而,当我没有设置我的自定义指令类的passthroughTrackIDvariables, startVideoCompositionRequest(request) 被调用,但不正确 – 打印request.sourceTrackIDs结果为一个空数组, request.sourceFrameByTrackID(trackID)结果为零值。 有趣的是,我发现cancelAllPendingVideoCompositionRequests:函数在尝试使用filter导出video时总是被调用两次。 它可以在startVideoCompositionRequest:之前被调用一次,也可以在startVideoCompositionRequest:未被调用的情况下连续两次。 我创build了三个类,用于filter导出video。 这里是实用程序类,它基本上只包含一个export函数,并调用所有必需的代码 class VideoFilterExport{ let asset: AVAsset init(asset: AVAsset){ self.asset = asset } func export(toURL url: NSURL, callback: (url: NSURL?) -> Void){ guard let track: AVAssetTrack = self.asset.tracksWithMediaType(AVMediaTypeVideo).first else{callback(url: nil); return} let composition = AVMutableComposition() let […]

Swift 3:如何在video上添加水印? AVVideoCompositionCoreAnimationTool iOS 10问题

此代码用于在iOS9上工作,为video添加水印和文本,但自iOS10以后,它不再工作。 有一个iOS 10的错误已经提交,但没有答复从苹果。 我还没有能够实施任何解决方法来添加水印和文字的video。 有了这段代码,video将被成功导出,但大部分时间将不会被导出。 我应该如何使用AVVideoCompositionCoreAnimationTool ,使其像iOS9一样工作。 let videoComposition: AVMutableVideoComposition = AVMutableVideoComposition() videoComposition.frameDuration = CMTimeMake(1, 60) videoComposition.renderSize = CGSize(width: clipVideoTrack.naturalSize.height, height: clipVideoTrack.naturalSize.height) let instruction: AVMutableVideoCompositionInstruction = AVMutableVideoCompositionInstruction() instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)) // transformer is applied to set the video in portrait otherwise it is rotated by 90 degrees let transformer: AVMutableVideoCompositionLayerInstruction = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack) […]

以与预览图层相匹配的大小导出AVCaptureSessionvideo

我使用AVCaptureSession录制video,会话预设为AVCaptureSessionPreset640x480 。 我正在使用非标准尺寸(300 x 300)的AVCaptureVideoPreviewLayer ,并在录制时将重力设置为方向填充。 它的设置是这样的: self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession]; _previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; _previewLayer.frame = _previewView.bounds; // 300 x 300 [_previewView.layer addSublayer:_previewLayer]; 录制video后,我想以快速格式将其写入文件。 在播放过程中,我再次以300 x 300的非标准尺寸图层播放video。 由于这些video最终将通过networking连接进行传输,因此保留完整的640x480video看起来很浪费。 导出video以匹配我的300 x 300预览图层的最佳方式是什么? 我是一个AVFoundation noob,所以如果我正在做这个错误的方式,请让我知道。 我只想在logging期间预览层中显示的录制video与磁盘上导出的video相匹配。

video在应用AVVideoComposition后旋转

将AVVideoComposition应用到我的AVPlayerItem ,我应用的滤镜可以工作,但是video在AVPlayerLayer旋转。 我知道这个问题是不是与过滤的框架,因为如果我在UIImageView显示帧,框架呈现100%正确。 video正确显示, 直到我申请一个videoComposition 。 在AVPlayerLayer上设置videoGravity不起作用。 video顺时针旋转90度并在图层中拉伸。 本质上,在AVPlayerLayer通过AVMutableVideoComposition提供之前,video在AVPlayerLayer完美显示。 一旦发生这种情况,video旋转了-90º,然后在过滤之前缩放到与video尺寸相同的尺寸。 这向我暗示,它并没有意识到它的转换已经是正确的了,所以它正在重新应用自身的转换。 为什么会发生这种情况,我该如何解决? 这里是一些代码: private func filterVideo(with filter: Filter?) { if let player = player, let playerItem = player.currentItem { let composition = AVMutableComposition() let videoAssetTrack = playerItem.asset.tracks(withMediaType: .video).first let videoCompositionTrack = composition.addMutableTrack(withMediaType: .video, preferredTrackID: kCMPersistentTrackID_Invalid) try? videoCompositionTrack?.insertTimeRange(CMTimeRange(start: kCMTimeZero, duration: playerItem.asset.duration), of: videoAssetTrack!, at: kCMTimeZero) videoCompositionTrack?.preferredTransform […]

如何使用AVAssetWriter制作缩小尺寸的video?

我会制作缩小尺寸的video,可能是50像素和75像素的长度。 这些是物理层面。 你如何设定? 在video设置? 我认为AVVideoWidthKey和AVVideoHeightKey是更多的决议不是物理尺寸,我所需要的。 NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: AVVideoCodecH264, AVVideoCodecKey, [NSNumber numberWithInt: 320], AVVideoWidthKey, [NSNumber numberWithInt:480], AVVideoHeightKey, nil]; AVAssetWriterInput* writerInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings] retain