- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我从 livephoto 中获取视频,并多次导出这样的视频。
它变得比源 livephoto 更红。这是一个错误?
这是导出代码,最后有一个演示项目。
- (void)clipMovie:(NSString *)path block:(void (^)(BOOL success))completionBlock
{
UIColor *bgcolor = (UIColor *)[UIColor blackColor];
AVURLAsset *videoasset = [[AVURLAsset alloc]initWithURL:[NSURL fileURLWithPath:path] options:nil];
AVMutableComposition *composition = [AVMutableComposition composition];
NSError *error;
[composition insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoasset.duration) ofAsset:videoasset atTime:kCMTimeZero error:&error];
AVMutableVideoCompositionInstruction *videoInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
videoInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, composition.duration);
videoInstruction.backgroundColor = bgcolor.CGColor;
if ([[composition tracksWithMediaType:AVMediaTypeVideo] count] > 0)
{
AVAssetTrack *videoTrack = [[composition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVMutableVideoCompositionLayerInstruction *cropLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
// CGSize naturalSize = videoTrack.naturalSize;
CGSize renderSize = CGSizeMake(1080, 1080);
AVAssetTrack *videoTracktmp = [[videoasset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
CGAffineTransform transform = videoTracktmp.preferredTransform;
CGRect drawrect = CGRectMake(0, 0, 1080, 1080);
[cropLayer setTransform:transform atTime:kCMTimeZero];
CALayer *backgroundLayer = [CALayer layer];
// [backgroundLayer setContents:(id)self.patternBgView.image.CGImage];
backgroundLayer.frame = CGRectMake(0, 0, renderSize.width, renderSize.height);
[backgroundLayer setMasksToBounds:YES];
backgroundLayer.backgroundColor = bgcolor.CGColor;
CALayer *videoLayer = [CALayer layer];
videoLayer.frame = CGRectMake(drawrect.origin.x, (renderSize.height-drawrect.size.height-drawrect.origin.y), drawrect.size.width, drawrect.size.height);
CALayer *parentLayer = [CALayer layer];
parentLayer.frame = CGRectMake(0, 0, renderSize.width, renderSize.height);
[parentLayer addSublayer:backgroundLayer];
[parentLayer addSublayer:videoLayer];
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
videoInstruction.layerInstructions = @[cropLayer];
videoComposition.instructions = @[videoInstruction];
videoComposition.renderSize = CGSizeMake(renderSize.width, renderSize.height);
videoComposition.frameDuration = CMTimeMake(1, 15);
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:videoasset presetName:AVAssetExportPresetHighestQuality];
exportSession.shouldOptimizeForNetworkUse = YES;
exportSession.videoComposition = videoComposition;
// exportSession.metadata = videoasset.metadata;
NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"] stringByAppendingPathComponent:@"a"];
BOOL bo = [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];
NSString *result = [path stringByAppendingPathComponent:@"a.mov"];
NSString *exportVideoPath = result;
// NSLog(@"%@",result);
if ([[NSFileManager defaultManager] fileExistsAtPath:exportVideoPath]) {
[[NSFileManager defaultManager] removeItemAtPath:exportVideoPath error:nil];
}
NSURL *exportURL = [NSURL fileURLWithPath:exportVideoPath];
exportSession.outputURL = exportURL;
// exportSession.metadata = [self updateMetadata:videoasset.metadata];
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
[exportSession exportAsynchronouslyWithCompletionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
switch ((int)exportSession.status) {
case AVAssetExportSessionStatusFailed:{
// NSLog (@"FAIL");
completionBlock(NO);
break;
}
case AVAssetExportSessionStatusCompleted: {
// NSLog (@"SUCCESS");
completionBlock(YES);
break;
}
};
});
}];
}
}
然后视频比源livephoto更红。
最佳答案
哎呀!就去做吧!
AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:videoasset presetName:AVAssetExportPresetPassthrough];
This export option will cause the media of all tracks to be passed through to the output exactly as stored in the source asset, except for tracks for which passthrough is not possible, usually because of constraints of the container format as indicated by the specified outputFileType. This option is not included in the arrays returned by -allExportPresets and -exportPresetsCompatibleWithAsset.
关于ios - AVAssetExportSession,AVMutableVideoComposition 让视频更红,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38430560/
我有一个应用程序,允许附加多个视频资源并向合成添加一个或多个音轨。一切似乎都有效,我可以使用 AVPlayer 播放生成的作品(尽管音频级别似乎很低)。将乐曲导出到文件后,音轨丢失。 我的代码主要基于
我有一个应用程序,可以将 AVMutableComposition 导出到 .mov 文件中,我希望用户可以使用进度条与发送短信或上传文件时的进度条相同。 当我知道任务的持续时间(例如播放音频文件)时
当应用程序在后台运行时,我尝试管理 AVAssetExportSession 工作。我有 iOS 6 设备并在那里进行测试。所以我正在制作音频混合并尝试导出音频。当应用程序在前台时,我一切正常,但如果
我正在尝试使用以下代码将2个预先存在的mpeg4视频加入到ipad2上。 -(void)mergeTestVideos { //setup asset NSString *firsta
我正在创建一个视频文件,并在其上添加动画图像。我跟踪导出进度和状态,但是在导出进度达到1.0后,不会调用回调,并且导出状态仍等于'AVAssetExportSessionStatusExporting
我想合并视频和音频文件。我的程序在调试/单步模式下按我想要的方式工作,但在运行时不工作。我想这可能是“exportAsynchronously”函数的问题,我在加载之前访问了一些值。这是我的代码。 合
AVAssetExportSession 从来没有告诉我导出何时完成,但它确实很快并且文件出现在应该出现的位置......我正在使用 exportAsynchronouslyWithCompletio
我正在尝试在应用程序中裁剪和合并多个视频。我在步骤的最后部分遇到问题,我需要将视频保存到相机卷轴并且 UIVideoAtPathIsCompatibleWithSavedPhotosAlbum 返回
我想在自定义 View 中录制视频,所以我按照以下代码使用 AVFoundation。 if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum
我正在使用 AVAssetExportSession 将多个视频合并在一起,但视频是立体声的,生成的视频是双单声道的。是否可以使用 AVAssetExportSession 合并视频并保持立体声 ch
我有一个应用程序可以将视频文件组合在一起制作一个长视频。视频之间可能会有延迟(例如,V1 从 t=0s 开始并运行 5 秒,V1 从 t=10s 开始)。在这种情况下,我希望视频卡住 V1 的最后一帧
我正在使用 AVAssetExportSession 以 640x480 的分辨率导出一些东西,这些文件有点怪异——可以预见的是怪异,但仍然怪异,因为我们需要通过 3G 网络从手机上传它们。除了降低分
我的目标是让用户从照片中选择视频,然后让他在上面添加标签。 这是我得到的: let audioAsset = AVURLAsset(url: selectedVideoURL) let videoAs
我有一个错误和一个问题。我想将修改后的视频导出到相机胶卷,但导出的视频与相机胶卷不兼容。 我也想删除最初录制的视频,以便我可以录制不止一次,但它会产生错误并且没有意义。如果我取消注释代码,则会出现错误
我正在尝试在视频的 AVMutableComposition 上应用 AVMutableVideoCompositionLayerInstruction。问题是当使用 AVAssetExportSes
我正在尝试将 2 个音频文件和 1 个视频文件合并为 1 个 .mov 文件。我用下一个代码实现它: -(void)combineData{ AVMutableComposition *mixComp
当应用程序在后台时,我无法让 AVAssetExportSession 工作。 我的应用程序启用了后台模式“Background Fetch”。 当这个 UIApplicationDelegate 方
我正在尝试对共享扩展中选择的视频使用 AVAssetExportSession 并获取 Error Domain=NSURLErrorDomain Code=-3000 "Cannot create
AVAssetExportSession 将预设作为其初始化参数之一: AVAssetExportSession(asset: AVAsset, presetName: String) 其中预设是 A
我正在使用 AVAssetExportSession 修剪音频文件,但无法在保存的文件中实现淡入淡出效果。这是我正在使用的代码。 [[NSFileManager defaultManag
我是一名优秀的程序员,十分优秀!