Ios 从图像创建视频并保存到相册

Ios 从图像创建视频并保存到相册,ios,image,audio,video,save,Ios,Image,Audio,Video,Save,我正在用一组图像和一个音频文件制作视频 但我似乎无法把它保存到摄像机上 有时它可以节省,但有时它不能,并给我一个奇怪的错误 outputFile.mp4无法保存到保存的相册中:错误域=NSOSStatusErrorDomain代码=-12848“无法播放电影”。用户信息=0x7bd7370{NSLocalizedDescription=无法播放电影。} 此函数用于从图像阵列创建视频: -(void) writeImagesToMovieAtPath:(NSString *) path withS

我正在用一组图像和一个音频文件制作视频

但我似乎无法把它保存到摄像机上

有时它可以节省,但有时它不能,并给我一个奇怪的错误

outputFile.mp4无法保存到保存的相册中:错误域=NSOSStatusErrorDomain代码=-12848“无法播放电影”。用户信息=0x7bd7370{NSLocalizedDescription=无法播放电影。}

此函数用于从图像阵列创建视频:

-(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];
}