2012-10-22 50 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您的問題。

相關問題