- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我的目标是合成一组从相机记录的剪辑,并以特定的首选大小导出它们。当然,导出前需要旋转视频方向。
我通过从存储在下面的 avAssets 中的视频剪辑数组组成一个 AVMutableComposition 来做到这一点。我能够很好地组合它们,并将其导出。但是,我在 AVMutableVideoComposition 上设置的旋转变换没有得到遵守。如果我使用相同的变换并将其设置在视频轨道的 preferredTransform 属性上,那么它就可以工作。在这两种情况下,视频 renderSize 都没有得到遵守。就好像导出器完全忽略了 videoComposition 一样。知道会发生什么吗?
我确实有一个 AVCaptureSession 正在运行,但我在导出之前将其关闭并且没有任何区别。我是 iOS 编程的新手,所以我可能缺少一些基本的东西。 :)
我的代码:
-(void) finalRecord{
NSError *error = nil;
AVMutableComposition *composition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
NSLog(@"Video track id is %d", [compositionVideoTrack trackID]);
AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
// avAssets hold the video clips to be composited
int pieces = [avAssets count];
CGAffineTransform transform = CGAffineTransformMakeRotation( M_PI_2);
// [compositionVideoTrack setPreferredTransform:transform];
for (int i = 0; i<pieces; i++) {
AVURLAsset *sourceAsset = [avAssets objectAtIndex:i];
AVAssetTrack *sourceVideoTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVAssetTrack *sourceAudioTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
[timeRanges addObject:[NSValue valueWithCMTimeRange:CMTimeRangeMake(kCMTimeZero, sourceAsset.duration)]];
[videoTracks addObject:sourceVideoTrack];
[audioTracks addObject:sourceAudioTrack];
}
[compositionVideoTrack insertTimeRanges:timeRanges ofTracks:videoTracks atTime:kCMTimeZero error:&error];
[compositionAudioTrack insertTimeRanges:timeRanges ofTracks:audioTracks atTime:kCMTimeZero error:&error];
AVMutableVideoCompositionInstruction *vtemp = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
vtemp.timeRange = CMTimeRangeMake(kCMTimeZero, [composition duration]);
NSLog(@"\nInstruction vtemp's time range is %f %f", CMTimeGetSeconds( vtemp.timeRange.start),
CMTimeGetSeconds(vtemp.timeRange.duration));
// Also tried videoCompositionLayerInstructionWithAssetTrack:compositionVideoTrack
AVMutableVideoCompositionLayerInstruction *vLayerInstruction = [AVMutableVideoCompositionLayerInstruction
videoCompositionLayerInstructionWithAssetTrack:composition.tracks[0]];
[vLayerInstruction setTransform:transform atTime:kCMTimeZero];
vtemp.layerInstructions = @[vLayerInstruction];
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
videoComposition.renderSize = CGSizeMake(320.0, 240.0);
videoComposition.frameDuration = CMTimeMake(1,30);
videoComposition.instructions = @[vtemp];
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:gVideoExportQuality];
NSParameterAssert(exporter != nil);
exporter.videoComposition = videoComposition;
exporter.outputFileType = AVFileTypeQuickTimeMovie;
NSString *rootName = [[self captureManager] tempFileRoot];
NSString *temp = [NSString stringWithFormat:@"%@%@.mov", NSTemporaryDirectory(), rootName];
exporter.outputURL = [NSURL fileURLWithPath:temp ];
[exporter exportAsynchronouslyWithCompletionHandler:^{
switch ([exporter status]) {
case AVAssetExportSessionStatusFailed:
NSLog(@"Export failed: %@", [exporter error]);
break;
case AVAssetExportSessionStatusCancelled:
NSLog(@"Export canceled");
break;
case AVAssetExportSessionStatusCompleted:
NSLog(@"Export successfully");
[self exportFile:exporter.outputURL];
[self.delegate recordingEndedWithFile:exporter.outputURL];
isExporting = FALSE;
[[[self captureManager] session] startRunning];
break;
default:
break;
}
if (exporter.status != AVAssetExportSessionStatusCompleted){
NSLog(@"Retry export");
}
}];
}
最佳答案
好的,想通了并在这里发帖是为了帮助其他人不要像我一样浪费时间。
问题是,如果您在 AVExportSession
上使用 AVAssetExportPresetPassthrough
,则导出器将忽略视频合成说明。我期待它至少在通过格式等时遵守视频合成说明,但显然这不是它的工作原理。在我填写文档错误后,您可以在 Technical Q&A 中找到它.
关于iphone - 导出时转换在 AVMutableVideoComposition 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15649136/
我正在尝试根据本教程在不同位置同时播放 2 个视频的组合:https://abdulazeem.wordpress.com/2012/04/02/video-manipulation-in-ios-r
我的设置如下:在我的应用程序的这一部分中,用户可以将视频排成一行。这些视频之间可能有间隙,或者稍后从 0 开始。 为了实现这一目标,我添加了一个功能,该功能添加全黑视频并在每个间隙期间循环播放: fu
我使用下面的代码在视频上添加图像叠加,然后将新生成的视频导出到文档目录。但奇怪的是,视频旋转了 90 度。 - (void)buildTransitionComposition:(AVMutableC
我使用下面的代码在视频上添加图像叠加层,然后将新生成的视频导出到文档目录。但奇怪的是,视频会旋转 90 度。 - (void)buildTransitionComposition:(AVMutable
我已经成功地用多个视频剪辑组成了一个 AVMutableComposition 并且可以查看和导出它,我希望能够使用淡入淡出在它们之间进行转换,所以我想使用 AVMutableVideoComposi
我使用下面的代码在视频上添加图像叠加层,然后将新生成的视频导出到文档目录。但奇怪的是,视频会旋转 90 度。 - (void)buildTransitionComposition:(AVMutable
我是 Swift 的新手。我正在尝试引用 SO 中的代码添加水印。我的原始视频分辨率是 1280 X 720,但输出视频是缩小版。 这是前后对比图 这是我创建水印的函数。 private func w
我正在使用这个简短的片段来设置我的视频。由于某些未知的原因 - 有时视频根本不会显示,而对于其他视频则可以完美运行。 let videoTrack: AVAssetTrack = asset.trac
我有 3 个视频,我正在使用 AVMutableComposition 进行排序,然后使用 AVPlayer 播放视频并使用 AVPlayerItemVdeoOutput 抓取帧.视频顺序如下: [L
我从 livephoto 中获取视频,并多次导出这样的视频。 它变得比源 livephoto 更红。这是一个错误? 这是导出代码,最后有一个演示项目。 - (void)clipMovie:(NSStr
下面是我用来导出视频的函数: - (void) videoOutput { //1 - Early exit if there's no video file selected if (!self.v
我找到了一些展示如何在视频上添加文本叠加层的示例。 Ray 的教程 - http://www.raywenderlich.com/30200/avfoundation-tutorial-adding-
我有一个过滤 AVPlayerItem Assets 的功能。问题之一是设置视频的转换。但是,每当我设置 AVMutableVideoComposition 的 AVMutableVideoCompo
我的目标是合成一组从相机记录的剪辑,并以特定的首选大小导出它们。当然,导出前需要旋转视频方向。 我通过从存储在下面的 avAssets 中的视频剪辑数组组成一个 AVMutableCompositio
所以我正在开发这个视频编辑器项目,但在获取 trackID 时遇到了问题我搜索了我所知道的所有地方,但我所能找到的只是一些 Objective-C 代码,但我无法将其转换为 swift 我在这一行收到
我创建了一个包含多个视频剪辑的合成,我还添加了一些空白范围,用于显示带有 CoreAnimation 的标题屏幕。 |--Video1--|--NoVideo(AVsyncLayer)--|--Vid
我正在尝试通过视频导出图像,但是当导出完成时,我得到了带有图像的黑屏视频。这是设置组合的代码: UIImage *myImage = [UIImage imageNamed:@"block.png"]
当我使用 this tutorial 创建视频时我试着移动 AVAssetTrack* firstTrack (没有动画,所以我不能使用 CAAnimation s)使用 AVMutableVideo
我有一个应用程序,允许用户以可变组合录制视频。我想设置一些文本,当用户在导出后播放它时,它会出现,然后按照我设置的时间间隔进行更改。 例如,如果第一个词是“dog”,那么我想将其设置为“cat”在 X
我正在做一些视频编辑,我需要将我正在操作的 AVMutableVideoComposition 放回播放器项目中。要进入播放器项目,它需要是一个 AVAsset。如何做到这一点? 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!