Ios 从图像创建视频并保存到相册
我正在用一组图像和一个音频文件制作视频 但我似乎无法把它保存到摄像机上 有时它可以节省,但有时它不能,并给我一个奇怪的错误 outputFile.mp4无法保存到保存的相册中:错误域=NSOSStatusErrorDomain代码=-12848“无法播放电影”。用户信息=0x7bd7370{NSLocalizedDescription=无法播放电影。} 此函数用于从图像阵列创建视频:Ios 从图像创建视频并保存到相册,ios,image,audio,video,save,Ios,Image,Audio,Video,Save,我正在用一组图像和一个音频文件制作视频 但我似乎无法把它保存到摄像机上 有时它可以节省,但有时它不能,并给我一个奇怪的错误 outputFile.mp4无法保存到保存的相册中:错误域=NSOSStatusErrorDomain代码=-12848“无法播放电影”。用户信息=0x7bd7370{NSLocalizedDescription=无法播放电影。} 此函数用于从图像阵列创建视频: -(void) writeImagesToMovieAtPath:(NSString *) path withS
-(void) writeImagesToMovieAtPath:(NSString *) path withSize:(CGSize) size
{
NSLog(@"Write Started");
NSError *error = nil;
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
[NSURL fileURLWithPath:path] fileType:AVFileTypeMPEG4
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 = 16;
int kRecordingFPS = 30;
UIImage * im = [UIImage imageNamed:@"IMG_0103.JPG"];
NSArray * imageArray = [[NSArray alloc]initWithObjects:im,im,im,im,im,im,im,im,im,im,im,im,im,im,im,im, nil];
for(UIImage * img in imageArray)
{
buffer = [self pixelBufferFromCGImage:[img CGImage] andSize:size];
BOOL append_ok = NO;
int j = 0;
while (!append_ok && j < 30)
{
if (adaptor.assetWriterInput.readyForMoreMediaData)
{
printf("appending %d attemp %d\n", frameCount, j);
CMTime frameTime = CMTimeMake(frameCount,(int32_t) kRecordingFPS);
append_ok = [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];
if(buffer)
CVBufferRelease(buffer);
[NSThread sleepForTimeInterval:0.05];
}
else
{
printf("adaptor not ready %d, %d\n", frameCount, j);
[NSThread sleepForTimeInterval:0.1];
}
j++;
}
if (!append_ok) {
printf("error appending image %d times %d\n", frameCount, j);
}
frameCount++;
}
//Finish the session:
[videoWriterInput markAsFinished];
[videoWriter finishWriting];
NSLog(@"Write Ended");
[videoWriterInput release];
[videoWriter release];
[imageArray release];
}
该函数调用:
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
UIImage * i = [UIImage imageNamed:@"IMG_0103.JPG"];
[self writeImagesToMovieAtPath:[NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,@"a.mp4"] withSize:CGSizeMake(i.size.width, i.size.height)];
NSString* exportVideoPath1 = [NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,@"a.mp4"];
NSString* exportVideoPath = [NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,@"outputFile.mp4"];
UISaveVideoAtPathToSavedPhotosAlbum (exportVideoPath,self, @selector(video:didFinishSavingWithError: contextInfo:), nil);
}
就我而言,原因是AVAssetWriter还没有写完。用以下代码解决了这个问题:
__block BOOL _finished = NO;
[assetWriter finishWritingWithCompletionHandler:^{
_finished = YES;
}];
while (!_finished) {
[NSThread sleepForTimeInterval:0.1];
}
你能再清楚一点吗。您制作了一个应用程序,可以将图片转换为视频,然后保存视频?有时,它不能拯救他们?你有什么代码可以分享你是如何使用它的吗?我添加了代码,主要是我在这篇文章中使用的代码:这正是发生的事情,有时它会保存,有时也不会。错误代码会自动更改为(代码=-12893)。我不确定这是否有用。但我在将图像保存到一个组(图像保存到gallery,类似于您正在做的事情)时遇到了类似的问题,在这个组中,它有时可以工作,但在其他组中却不能工作。问题似乎是操作系统在某个特定的时间内阻止了调用。我绕过了这个问题,添加了代码,在等待0.1秒后再次尝试失败。这解决了我的问题。如果出现错误,请尝试添加一个呼叫以在延迟一段时间后重试。我让它休眠1秒,然后尝试保存增益,但它一直在尝试,并以任何方式给出相同的错误@Bergasms THX:D
__block BOOL _finished = NO;
[assetWriter finishWritingWithCompletionHandler:^{
_finished = YES;
}];
while (!_finished) {
[NSThread sleepForTimeInterval:0.1];
}