我必须从我的iPhone应用程序导出一部电影,其中包含来自NSArray的UIImage,并添加一些必须在预先指定的时间开始的.caf格式的音频文件.现在我已经能够使用AVAssetWriter导出包含图像的视频部分(经历就这个问题和其他网站的许多问题和答案后),但不能似乎找到一个方法来添加音频文件来完成电影.
这是我到目前为止所得到的
-(void) writeImagesToMovieAtPath:(NSString *) path withSize:(CGSize) size
{
NSLog(@"Write Started");
NSError *error = nil;
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
[NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie
error:&error];
NSParameterAssert(videoWriter);
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:size.width], AVVideoWidthKey,
[NSNumber numberWithInt:size.height], AVVideoHeightKey,
nil];
AVAssetWriterInput* videoWriterInput = [[AVAssetWriterInput
assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings] retain];
AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor
assetWriterInputPixelBufferAdaptorWithAssetWriterInput:videoWriterInput
sourcePixelBufferAttributes:nil];
NSParameterAssert(videoWriterInput);
NSParameterAssert([videoWriter canAddInput:videoWriterInput]);
videoWriterInput.expectsMediaDataInRealTime = YES;
[videoWriter addInput:videoWriterInput];
//Start a session:
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:kCMTimeZero];
CVPixelBufferRef buffer = NULL;
//convert uiimage to CGImage.
int frameCount = 0; …
Run Code Online (Sandbox Code Playgroud) 我使用下面的代码在视频上添加图像叠加,然后将新生成的视频导出到文档目录.但奇怪的是,视频旋转了90度.
- (void)buildTransitionComposition:(AVMutableComposition *)composition andVideoComposition:(AVMutableVideoComposition *)videoComposition
{
CMTime nextClipStartTime = kCMTimeZero;
NSInteger i;
// Make transitionDuration no greater than half the shortest clip duration.
CMTime transitionDuration = self.transitionDuration;
for (i = 0; i < [_clips count]; i++ ) {
NSValue *clipTimeRange = [_clipTimeRanges objectAtIndex:i];
if (clipTimeRange) {
CMTime halfClipDuration = [clipTimeRange CMTimeRangeValue].duration;
halfClipDuration.timescale *= 2; // You can halve a rational by doubling its denominator.
transitionDuration = CMTimeMinimum(transitionDuration, halfClipDuration);
}
}
// Add two video tracks and two audio tracks. …
Run Code Online (Sandbox Code Playgroud) TLDR - SEE EDIT
我正在Swift中创建一个测试应用程序,我想在我的应用程序文档目录中拼接多个视频AVMutableComposition
.
我在某种程度上成功地做到了这一点,我的所有视频都拼凑在一起,一切都显示出正确尺寸的肖像和风景.
但问题是,所有视频都显示在编辑中最后一个视频的方向上.
我知道要解决这个问题,我需要为我添加的每个曲目添加图层说明,但是我似乎无法做到这一点,我发现整个编辑的答案似乎是以纵向方式出现的风景视频只需按比例缩放以适应纵向视图,因此当我将手机侧面转动以查看风景视频时,它们仍然很小,因为它们已缩放为纵向尺寸.
这不是我想要的结果,我想要预期的功能,即如果视频是横向的,它在纵向模式下显示缩放,但如果手机旋转,我希望该横向视频填充屏幕(就像在查看时一样)照片中的风景视频)和肖像相同,因此在纵向观看时它是全屏的,当侧向转动时,视频会缩放到横向尺寸(就像在照片中查看肖像视频时一样).
总之,我想要的结果是,当查看具有横向和纵向视频的编辑时,我可以使用我的手机侧面查看整个编辑,并且横向视频是全屏的,纵向是缩放的,或者在查看相同的视频时肖像肖像视频全屏,风景视频按比例缩放.
通过所有答案,我发现情况并非如此,当从照片导入视频以添加到编辑时,它们似乎都有非常意外的行为,并且在添加使用前置摄像头拍摄的视频时具有相同的随机行为(至明确我目前的实施视频从图书馆导入和"自拍"视频出现正确的大小没有这些问题).
我正在寻找一种旋转/缩放这些视频的方法,以便它们始终以正确的方向和比例显示,具体取决于用户握住手机的方向.
编辑:我现在知道我不能在一个视频中同时拥有横向和纵向方向,所以我正在寻找的预期结果是以横向方向制作最终视频.我已经想出如何切换所有的方向和比例,以获得一切相同的方式,但我的输出是一个肖像视频,如果有人可以帮助我改变这,所以我的输出是景观,将不胜感激.
以下是我获取每个视频说明的功能:
func videoTransformForTrack(asset: AVAsset) -> CGAffineTransform
{
var return_value:CGAffineTransform?
let assetTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0]
let transform = assetTrack.preferredTransform
let assetInfo = orientationFromTransform(transform)
var scaleToFitRatio = UIScreen.mainScreen().bounds.width / assetTrack.naturalSize.width
if assetInfo.isPortrait
{
scaleToFitRatio = UIScreen.mainScreen().bounds.width / assetTrack.naturalSize.height
let scaleFactor = CGAffineTransformMakeScale(scaleToFitRatio, scaleToFitRatio)
return_value = CGAffineTransformConcat(assetTrack.preferredTransform, scaleFactor)
}
else
{
let scaleFactor = CGAffineTransformMakeScale(scaleToFitRatio, scaleToFitRatio)
var concat = CGAffineTransformConcat(CGAffineTransformConcat(assetTrack.preferredTransform, scaleFactor), CGAffineTransformMakeTranslation(0, UIScreen.mainScreen().bounds.width / …
Run Code Online (Sandbox Code Playgroud) 我正在AVMutableComposition
使用AVAssetExportSession
预设来创建视频并将其导出AVAssetExportPresetHighestQuality
.
当视频尺寸较小时,视频会很好地创建.但是当视频的尺寸很大时(例如1280×1920),视频创建不正确.绿色叠加层添加到视频,如下图所示:
但是当我使用AVAssetExportPresetPassthrough
代替AVAssetExportPresetHighestQuality
,视频创建的罚款.
知道为什么会这样吗?
提前致谢!!
我正在尝试将单个视频与单个图像组合在一起.这不是试图将许多图像组合成单个视频,例如
我AVMutableComposition
用来组合曲目.我的应用程序能够组合视频和图像(但就目前而言,视频组合很好!)我尝试使用AVAssetWriter
将单个图像转换为视频(我相信这是我的问题,但不是100%肯定) .然后我将其保存到app(documents directory
).从那里,我在合并中访问它,并将视频和现在变成视频的图像组合在一起.
流程:
用户选择图像 - >
将图像转换为AVAssetWriter以更改为视频 - >
合并我已预设的视频视频 - >
结果:从所选图像和预设视频制作1个视频.
我的问题:我的代码提供了一个空白区域,视频内部的图像应该是.就像在我的ImageConverter文件中一样,它会将它转换为视频,但我只会看到最后一帧作为图像,而每隔一帧都是透明的,好像图片不存在一样.因此,如果我将图像转换为视频5秒钟(假设是30帧/秒),那么我将看到(30*5)-1帧的空白区域,然后是最后一帧,最终会出现图片.我正在寻找有关如何将单个图像制作成视频或将视频和图像组合在一起而不将图像转换为视频的指导.谢谢!
合并文件在这里
func merge() {
if let firstAsset = controller.firstAsset, secondAsset = self.asset {
// 1 - Create AVMutableComposition object. This object will hold your AVMutableCompositionTrack instances.
let mixComposition = AVMutableComposition()
let firstTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do {
try firstTrack.insertTimeRange(CMTimeRangeMake(kCMTimeZero, CMTime(seconds: 8, preferredTimescale: 600)),
ofTrack: firstAsset.tracksWithMediaType(AVMediaTypeVideo)[0] ,
atTime: kCMTimeZero)
} …
Run Code Online (Sandbox Code Playgroud) 下面的新编辑
我已经引用了
AVMutableComposition - 仅播放第一曲目(Swift)
但它没有提供我正在寻找的答案.
我有一个AVMutableComposition()
.我试图在这个单一的组合中应用MULTIPLE AVCompositionTrack
,单一类型AVMediaTypeVideo
.这是因为我用2个不同的AVMediaTypeVideo
具有不同来源CGSize
的和preferredTransforms
的的AVAsset
"他们来自秒.
因此,应用指定的唯一方法preferredTransforms
是在两个不同的轨道中提供它们.但是,无论出于何种原因,只有第一首曲目实际上会提供任何视频,几乎就像第二首曲目从未出现过一样.
所以,我试过了
1)使用AVMutableVideoCompositionLayerInstruction
's并且应用一个AVVideoComposition
,一个AVAssetExportSession
正常工作,我仍然在进行变换,但是可行.但视频的处理时间超过1分钟,这在我的情况下是不适用的.
2)使用多个音轨,AVAssetExportSession
不会出现相同类型的第二个音轨.现在,我可以将它全部放在一个轨道上,但所有视频将与第一个视频相同的尺寸和首选视频,这是我绝对不想要的,因为它会在各个方向上拉伸它们.
所以我的问题是,是否有可能
1)在没有使用的情况下将指令应用于轨道AVAssetExportSession
?//首选方式BY FAR.
2)减少出口时间?(我已经尝试过使用PresetPassthrough
但你不能使用它,如果你有exporter.videoComposition
我的指示所在的地方.这是我知道我可以放指令的唯一地方,不知道我是否可以将它们放在其他地方.
这是我的一些代码(没有导出器,因为我不需要在任何地方导出任何东西,只需在AVMutableComposition组合项目后执行操作.
func merge() {
if let firstAsset = controller.firstAsset, secondAsset = self.asset {
let mixComposition = AVMutableComposition()
let firstTrack = mixComposition.addMutableTrackWithMediaType(AVMediaTypeVideo,
preferredTrackID: Int32(kCMPersistentTrackID_Invalid))
do {
//Don't need now according to not being able to edit …
Run Code Online (Sandbox Code Playgroud) 我有AVMutableComposition
一个视频轨道,我想在视频轨道中添加一个静止图像,以便显示一段时间.静止图像只是一个PNG.我可以将图像作为资产加载,但这就是它,因为结果资产没有任何轨道,因此不能简单地使用这些insertTimeRange…
方法插入.
有没有办法将静止图像添加到合成中?看起来答案在Core Animation的某个地方,但整个事情似乎有点高于我的头脑,我会很感激代码示例或一些信息指针.
编辑:最奇怪的事情:似乎从完整的应用程序运行此代码一切正常,但我总是从我的单元测试运行电影的创建,只有它没有工作.试图弄清楚为什么......
我正在尝试使用AVMutableComposition合并视频+音频+文本并将其导出到新视频.
我的代码基于WWDC '10的AVEditDemo
我在CATextLayer中添加了一个紫色背景,所以我可以知道它被导出到电影中,但没有显示文字......我尝试使用各种字体,位置,颜色定义,但没有任何帮助,所以我决定在这里发布代码,看看是否有人偶然发现了类似的东西,并告诉我我错过了什么.
这是代码(self.audio和self.video是AVURLAssets):
CMTime exportDuration = self.audio.duration;
AVMutableComposition *composition = [[AVMutableComposition alloc] init];
AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
AVAssetTrack *videoTrack = [[self.video tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
// add the video in loop until the audio ends
CMTime currStartTime = kCMTimeZero;
while (CMTimeCompare(currStartTime, exportDuration) < 0) {
CMTime timeRemaining = CMTimeSubtract(exportDuration, currStartTime);
CMTime currLoopDuration = self.video.duration;
if (CMTimeCompare(currLoopDuration, timeRemaining) > 0) {
currLoopDuration = timeRemaining;
}
CMTimeRange currLoopTimeRange = CMTimeRangeMake(kCMTimeZero, currLoopDuration);
[compositionVideoTrack insertTimeRange:currLoopTimeRange ofTrack:videoTrack
atTime:currStartTime error:nil];
currStartTime = CMTimeAdd(currStartTime, …
Run Code Online (Sandbox Code Playgroud) 这是代码:
AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
exporter.outputURL = outputUrl;
exporter.outputFileType = AVFileTypeQuickTimeMovie;
exporter.videoComposition = mainComposition;
exporter.shouldOptimizeForNetworkUse = YES;
[exporter exportAsynchronouslyWithCompletionHandler:^{
//completion
}];
Run Code Online (Sandbox Code Playgroud)
我尝试过不同的质量设置.无论我想渲染什么视频,我总是在视频右侧和底部都有一个1-2像素的边框.可能导致这种情况的原因以及如何解决?
编辑:我没有在任何地方使用任何绿色,所以这必须以某种方式来自框架.
avfoundation ios avmutablecomposition avassetexportsession avasset
我试图在嵌套层次结构中使用AVMutableComposition.因此,我必须将一种成分放入其他成分中.这样做会导致以下错误消息:
AVCompositionTest [45347:10703] comp2 >>>操作无法完成
我使用了以下代码剪切.
AVAsset *audioAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"02 Undefined" ofType:@"mp3"]]];
AVMutableComposition *comp1 = [AVMutableComposition composition];
BOOL success = YES;
NSError *error = nil;
success = [comp1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
ofAsset:audioAsset
atTime:kCMTimeZero
error:&error];
if (!success) {
NSLog(@"comp1 >>> %@", [error localizedDescription]);
}
AVMutableComposition *comp2 = [AVMutableComposition composition];
success = [comp2 insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
ofAsset:comp1
atTime:kCMTimeZero
error:&error];
if (!success) {
NSLog(@"comp2 >>> %@", [error localizedDescription]);
}
Run Code Online (Sandbox Code Playgroud)
是否有可能筑巢成分?
avfoundation ×6
ios ×6
iphone ×3
swift ×3
avasset ×2
buffer ×1
catextlayer ×1
cgsize ×1
cocoa ×1
objective-c ×1
uiimage ×1
video ×1