Ios 从图像阵列创建视频并将其保存到摄影机卷
我试图从一组图像中制作一个视频,我找到了一些代码并使其正常工作 但是视频不会保存到照片库,因为它给了我以下错误: Documentsa.mov无法保存到已保存的相册中:错误域=NSOSStatusErrorDomain代码=2“无法播放此电影。”用户信息=0x922cf60{NSLocalizedDescription=无法播放此电影。} 以下是我使用的代码:Ios 从图像阵列创建视频并将其保存到摄影机卷,ios,video,save,avassetwriter,avasset,Ios,Video,Save,Avassetwriter,Avasset,我试图从一组图像中制作一个视频,我找到了一些代码并使其正常工作 但是视频不会保存到照片库,因为它给了我以下错误: Documentsa.mov无法保存到已保存的相册中:错误域=NSOSStatusErrorDomain代码=2“无法播放此电影。”用户信息=0x922cf60{NSLocalizedDescription=无法播放此电影。} 以下是我使用的代码: NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDom
NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
UIImage * i = [UIImage imageNamed:@"IMG_1650.JPG"];
CGAffineTransform transform = CGAffineTransformMakeRotation((M_PI/180)*90);
GPUImageTransformFilter * filter = [[GPUImageTransformFilter alloc]init];
[filter setAffineTransform:transform];
UIImage * im = [filter imageByFilteringImage:i];
im = [filter imageByFilteringImage:im];
[self writeImagesToMovieAtPath:[NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,@"a.mov"] withSize:CGSizeMake(i.size.width, i.size.height)];
NSString* exportVideoPath = [NSString stringWithFormat:@"%@%@",documentsDirectoryPath,@"a.mov"];
UISaveVideoAtPathToSavedPhotosAlbum (exportVideoPath,self, @selector(video:didFinishSavingWithError: contextInfo:), nil);
这是我用来制作视频的代码:
-(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 = 1;
int kRecordingFPS = 30;
UIImage * im = [UIImage imageNamed:@"IMG_1650.JPG"];
CGAffineTransform transform = CGAffineTransformMakeRotation((M_PI/180)*90);
GPUImageTransformFilter * filter = [[GPUImageTransformFilter alloc]init];
[filter setAffineTransform:transform];
UIImage * i = [filter imageByFilteringImage:im];
i = [filter imageByFilteringImage:im];
NSArray * imageArray = [[NSArray alloc]initWithObjects:i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i, 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");
}
我发现视频不兼容
但是我不知道为什么或者如何解决这个问题,我在之前的评论中尝试了A-Live的解决方案 问题是图像太大了
有没有办法克服这个问题?你说的克服是什么意思?我相信您可以将文件从文档发送到任何后端服务器来存储它,而其他具有更好(您知道我的意思)视频支持的设备将能够播放它。但是,即使某些“黑客”可能,也不太可能超越操作系统的限制 我的意思是1080p是图书馆中最好的视频文件分辨率,因为图书馆的媒体必须可以播放。尽管如此,你仍然可以将文件存储在应用程序文档中并手动解码,这听起来像是一项有趣的任务:)但要确保你不会将其与iCloud同步,以避免巨大的流量泄漏让客户发疯。视频路径
NSString* exportVideoPath = [NSString stringWithFormat:@"%@%@",documentsDirectoryPath,@"a.mov"];
这是错误的。您缺少“/”分隔符
换成这个
NSString* exportVideoPath = [NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,@"a.mov"];
希望这能解决您的问题。哇,这段代码现在有点乱。。。。也许在找到答案后有必要对SE进行一段时间的代码检查。检查图像分辨率,iDevices对播放格式的支持非常有限。IMG_1650看起来像一个相机照片文件,而iPad只支持1080p h264.THX@a-Live。我用一个较小的图像替换了这个图像,它工作了。难道没有办法克服这个问题吗?还是我必须调整所有图像的大小?直到存在。谢谢@CodaFi!一个提示-请随意使用问题下方的
编辑
按钮保持更新。还请考虑到该网站是全球访问的,这意味着时区可能会非常不同。
NSString* exportVideoPath = [NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,@"a.mov"];