Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从图像阵列创建视频并将其保存到摄影机卷_Ios_Video_Save_Avassetwriter_Avasset - Fatal编程技术网

Ios 从图像阵列创建视频并将其保存到摄影机卷

Ios 从图像阵列创建视频并将其保存到摄影机卷,ios,video,save,avassetwriter,avasset,Ios,Video,Save,Avassetwriter,Avasset,我试图从一组图像中制作一个视频,我找到了一些代码并使其正常工作 但是视频不会保存到照片库,因为它给了我以下错误: Documentsa.mov无法保存到已保存的相册中:错误域=NSOSStatusErrorDomain代码=2“无法播放此电影。”用户信息=0x922cf60{NSLocalizedDescription=无法播放此电影。} 以下是我使用的代码: NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDom

我试图从一组图像中制作一个视频,我找到了一些代码并使其正常工作

但是视频不会保存到照片库,因为它给了我以下错误:

Documentsa.mov无法保存到已保存的相册中:错误域=NSOSStatusErrorDomain代码=2“无法播放此电影。”用户信息=0x922cf60{NSLocalizedDescription=无法播放此电影。}

以下是我使用的代码:

 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"];