2012-10-22 54 views
2

我试图让一组图像的视频,我发现一些代码,得到它的工作创建从图像中的数组视频并保存到相机胶卷

但视频不会被保存到照片库它给了我这个错误:

Documentsa.mov无法保存到保存的照片相册:错误域= NSOSStatusErrorDomain代码= 2“这部电影无法播放。”的UserInfo = 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"); 
} 

我试图检查视频是否兼容使用

UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(videoPath) 

我发现视频isn' T支持

,但我不知道为什么或如何解决这个

+0

哇,这段代码现在有点混乱....也许在SE:代码审查的一段时间后,找到答案是必要的。 – CodaFi

+0

检查图像分辨率,iDevices有相当有限的播放格式支持。 IMG_1650看起来像照相机照片文件,而iPad仅支持1080p h264。 –

+0

THX @ A-Live 我用一个较小的替换图像,它的工作 是不是有办法超过这个? 还是必须调整我的所有图像? –

回答

0

我试图在之前的评论

问题竟然是图像的大小是由A-Live中的解决方案太大

有没有办法解决这个问题?

+0

一个提示 - 随意使用问题下方的“编辑”按钮保持更新。还请考虑该网站是全球访问,这意味着时区可能会非常不同。 –

0

你是什么意思,克服?我相信你可以将文件从文档发送到任何后端服务器,以便将其存储在其他设备上,并使用更好的视频支持(您知道我的意思)支持其播放视频。但是,即使可能通过某些“黑客行为”,超出操作系统限制也不太可能。

我的意思是1080p是最大的视频文件分辨率在图书馆,因为媒体库必须可播放。尽管如此,您仍然可以将文件存储在应用程序文档中并手动解码,听起来像是一项有趣的任务:)确保您不会与iCloud同步,以避免巨大的流量泄漏,从而令客户疯狂。

1

的将videoPath

NSString* exportVideoPath = [NSString stringWithFormat:@"%@%@",documentsDirectoryPath,@"a.mov"]; 

是错误的。你缺少'/'分隔符。

改成这样

NSString* exportVideoPath = [NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,@"a.mov"]; 

希望这应该SOVE您的问题。

相关问题