- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试采用不同的方法来组合视频。我正在为每个转换创建一个新轨道。
此代码的问题在于显示了第一个视频,而其他所有视频都是黑色的。
整个片段的音频覆盖都是正确的。看起来视频没有带入合成中,因为文件的大小是 5 M,而它应该是 25M 左右。 5M 大小与第一个剪辑和音轨的大小相关。所有 AVAssets 似乎都是有效的。这些文件确实存在于文件系统中。这是代码:
- (void)mergeVideos:(NSMutableArray *)assets withCompletion:(void (^)(NSString *))completion; {
// NSMutableArray *instructions = [NSMutableArray new];
CGSize size = CGSizeZero;
CMTime currentstarttime = kCMTimeZero;
int tracknumber = 1;
int32_t commontimescale = 600;
CMTime time = kCMTimeZero;
AVMutableComposition *mutableComposition = [AVMutableComposition composition];
NSMutableArray *instructions = [[NSMutableArray alloc] init];
for (NSURL *assetUrl in assets) {
AVAsset *asset = [AVAsset assetWithURL:assetUrl];
NSLog(@"Number of tracks: %lu Incremental track number %i", (unsigned long)[[asset tracks] count], tracknumber);
// make sure the timescales are correct for these tracks
CMTime cliptime = CMTimeConvertScale(asset.duration, commontimescale, kCMTimeRoundingMethod_QuickTime);
AVMutableCompositionTrack *videoCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeVideo
preferredTrackID:kCMPersistentTrackID_Invalid];
AVAssetTrack *assetTrack = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject;
NSLog(@"Running time: value = %lld timescale = %d", time.value, time.timescale);
NSLog(@"Asset length: value = %lld timescale = %d", asset.duration.value, asset.duration.timescale);
NSLog(@"Converted Scale: value = %lld timescale = %d", cliptime.value, cliptime.timescale);
NSError *error;
[videoCompositionTrack insertEmptyTimeRange:CMTimeRangeMake(kCMTimeZero, time)];
[videoCompositionTrack insertTimeRange:CMTimeRangeMake(time, cliptime)
ofTrack:assetTrack
atTime:time
error:&error];
if (error) {
NSLog(@"Error - %@", error.debugDescription);
}
// this flips the video temporarily for the front facing camera
AVMutableVideoCompositionLayerInstruction *inst = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoCompositionTrack];
// set the flipping trasform to the correct tracks
if ((tracknumber == 2) || (tracknumber == 4) || (tracknumber == 6) || (tracknumber == 8) || (tracknumber == 10)) {
CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI);
[inst setTransform:transform atTime:time];
} else {
CGAffineTransform transform = assetTrack.preferredTransform;
[inst setTransform:transform atTime:time];
}
// don't block the other videos with your black - needs to be the incremental time
[inst setOpacity:0.0 atTime:time];
// add the instructions to the overall array
[instructions addObject:inst];
// increment the total time after w use it for this iteration
time = CMTimeAdd(time, cliptime);
if (CGSizeEqualToSize(size, CGSizeZero)) {
size = [asset tracksWithMediaType:AVMediaTypeVideo].firstObject.naturalSize;;
}
// incrememt the track counter
tracknumber++;
}
AVMutableVideoCompositionInstruction *mainVideoCompositionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
mainVideoCompositionInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, time);
mainVideoCompositionInstruction.layerInstructions = instructions;
// bring all of the video together in the main composition
AVMutableVideoComposition *mainVideoComposition = [AVMutableVideoComposition videoComposition];
mainVideoComposition.instructions = [NSArray arrayWithObject:mainVideoCompositionInstruction];
// setup the audio
AVMutableCompositionTrack *audioCompositionTrack = [mutableComposition addMutableTrackWithMediaType:AVMediaTypeAudio
preferredTrackID:kCMPersistentTrackID_Invalid];
// Grab the path, make sure to add it to your project!
NSURL *soundURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"bink-bink-lexus-3" ofType:@"aif"]];
AVURLAsset *soundAsset = [AVURLAsset assetWithURL:soundURL];
NSError *error;
// add audio to the entire track
[audioCompositionTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, mutableComposition.duration)
ofTrack:[soundAsset tracksWithMediaType:AVMediaTypeAudio][0]
atTime:kCMTimeZero
error:&error];
// Set the frame duration to an appropriate value (i.e. 30 frames per second for video).
// mainVideoComposition.frameDuration = CMTimeMake(1, 30);
mainVideoComposition.renderSize = size;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths firstObject];
int number = arc4random_uniform(10000);
self.outputFile = [documentsDirectory stringByAppendingFormat:@"/export_%i.mov",number];
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mutableComposition
presetName:AVAssetExportPreset1280x720];
exporter.outputURL = [NSURL fileURLWithPath:self.outputFile];
//Set the output file type
exporter.outputFileType = AVFileTypeQuickTimeMovie;
exporter.shouldOptimizeForNetworkUse = YES;
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
[exporter exportAsynchronouslyWithCompletionHandler:^{
dispatch_group_leave(group);
}];
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"Export File (Final) - %@", self.outputFile);
completion(self.outputFile);
});
}
最佳答案
您的问题是,通过使用多个 AVMutableCompositionTracks 并在 kCMTimeZero 之后一次插入一个时间范围,您将导致每个后续轨道的媒体出现在 kCMTimeZero 的合成中。您需要使用 insertEmptyTimeRange:如果你想走这条路。它会根据您插入的空白范围的持续时间及时向前移动该特定轨道的媒体。
或者,更简单的方法是使用单个 AVMutableCompositionTrack。
关于AVFoundation - 只合并第一个显示的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32977879/
我有一个 AVMutableVideoComposition,我正在使用 AVAssetExportSession 导出它,我正在尝试覆盖一个每秒更新一次的自定义时间戳。我应该使用 AVAssetWr
我是 MAC OSX 开发的新手。我想在 OSX 10.7 上使用 AVFoundation 将视频捕获为原始帧。我不明白为相机设备设置特定的视频分辨率,不知何故我使用 VideoSettings 设
使用 AVFoundation/QTKit 如何将多个视频设备同时录制到一个文件中? 我知道如何分别记录它们,但是尝试同时记录它们会导致诸如... “无法添加到 session 中,因为源和目标媒体类
我有一个关于 CoreAudio 和 AVFoundation 的问题。 我使用 CoreAudio 和 AUGraph 和 AudioUnit 构建了一个专业音频应用程序。 我想切换到看起来非常棒的
Apple Watch 能用吗AVFoundation ?更具体地说,可以AVAudioPlayer和 AVAudioRecorder工作? 我正在尝试制作一个应用程序,让您可以将声音录制到 Appl
Apple Watch 可以使用 AVFoundation 吗?更具体地说,AVAudioPlayer 和 AVAudioRecorder 可以工作吗? 我正在尝试制作一个应用程序,让您可以将声音录制
当我创建一个 iOS 项目和“Build Phases -> Link binary with Libraries”时,我添加了 AVFoundation.framework 库并使用 #import
我正在尝试创建一个格式正确的视频文件,用于 Apple 的 HTTP Live Streaming。这是创建文件的代码: // Init the device inputs AVCaptureDevi
我检查了答案,但找不到任何代码..我还登录以查看是否丢失了某些东西,但两个Logg都出现了,但声音没有播放...我也导入了 框架...我不知道我在做什么错我是新手,请帮忙...谢谢 - (void)v
对于这个问题,我只询问在没有外部库的情况下使用 Xcode 和 iOS 的可能性。我已经在探索在另一个 question 中使用 libtiff 的可能性. 问题 数周以来,我一直在筛选堆栈溢出,并为
我正在尝试采用不同的方法来组合视频。我正在为每个转换创建一个新轨道。 此代码的问题在于显示了第一个视频,而其他所有视频都是黑色的。 整个片段的音频覆盖都是正确的。看起来视频没有带入合成中,因为文件的大
回到使用AVAudioPlayer时,使用currentPosition来获取并设置位置,但是当使用AVAudioEngine和AVAudioPlayerNode时会使用什么呢? 最佳答案 AVAud
有人可以帮我将一个图标合并到一个视频中,该视频应该在视频播放时摆动。我已将动画添加到摆动图标,但只有静态图标会合并到视频中。如果有人可以帮助我,我将不胜感激。 我给你我正在使用的代码 //- (voi
Example 你好, 努力旋转此视频以显示在正确的方向并填满整个屏幕。 我无法使用 videocompisition 获取 avasset,但无法使其正常工作。 let videoAsset
如何一次在屏幕上显示多个相机预览? 如果我开始一个新的 AVCaptureSession,另一个就会停止。如果我使用与另一个 session 相同的 session 初始化一个新的 AVCapture
以下是我的录制按钮方法的内容。它创建了所需的文件,但无论我记录多长时间,创建的文件的长度始终为 4kb 和 0 秒,我无法弄清楚为什么它无效。对于averagePowerPerChannel,计量也返
我已经研究这个太久了。 我正在尝试获取 MacOS 网络摄像头数据并在网络摄像头输出的帧上运行 CIDetect。 我知道我需要: 连接 AVCaptureDevice (如输入)到AVCapture
我正在尝试从 CMSampleBufferRef 检索 CVPixelBufferRef,以便更改 CVPixelBufferRef 以动态覆盖水印。 我正在使用 CMSampleBufferGetI
捕获图像时,输出图像的颜色与我在预览图层上看到的颜色不同。出于某种原因,颜色略有变化。有没有人遇到过这个问题?我怎样才能解决这个问题? 当我从 didFinishProcessingPhotoSamp
对于 iOS5 来说可能是一个简单的问题他们将 AVFoundation 的eekToTime 方法更改为如下所示: [avPlayer seekToTime:startTime toleranceB
我是一名优秀的程序员,十分优秀!