簡體   English   中英

Iphone SDK,從UIImage創建視頻

[英]Iphone SDK,Create a Video from UIImage

我需要從所選圖像中創建視頻。

我有代碼它shoudl工作,但它在附加緩沖區時給出錯誤。

這就是保存這兩種圖像的方式。

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo 
{
    //    NSLog(@"Came From Here");
    imgv.image = img;   
    AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    app.imgmain = img;
    [self dismissModalViewControllerAnimated:YES];
    RecordVoice *rec = [[RecordVoice alloc] initWithNibName:@"RecordVoice" bundle:nil];
    rec.hidesBottomBarWhenPushed = YES;
    // rec.img.image = img;
    [self.navigationController pushViewController:rec animated:YES];
    //[self presentModalViewController:rec animated:YES];
    [rec release];
    //  flag =@"yes";
    // need to show the upload image button now
    //  [username, ititle resignFirstResponder];



}

在另一個視圖控制器上,我在uiimage視圖上顯示此圖像。

按下按鈕我將使用此代碼將該圖像轉換為視頻。

-(void)createVideoFile
{

        NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectoryPath error:nil];
        for (NSString *tString in dirContents) {
            if ([tString isEqualToString:@"test.mp4"]) 
            {
                [[NSFileManager defaultManager]removeItemAtPath:[NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,tString] error:nil];

            }
        }
    NSString *nfile = [documentsDirectoryPath stringByAppendingPathComponent:@"test.mp4"];
    AVURLAsset * urlAsset = [AVURLAsset URLAssetWithURL:recordedTmpFile options:nil];

        NSLog(@"Write Started");

        NSError *error = nil;
    CGSize size = img.image.size; //CGSizeMake(320, 480);




    NSLog(@"Write Started");


    AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
                                  [NSURL fileURLWithPath:nfile] 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 = 0;

        buffer = [self pixelBufferFromCGImage:[img.image 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 = urlAsset.duration;//CMTimeMake(frameCount,(int32_t) 10);
                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++;


        [videoWriterInput markAsFinished];  
         [videoWriter finishWriting];




    [self CompileFilesToMakeMovie];
    [altv dismissWithClickedButtonIndex:0 animated:YES];
    [altv release];



        NSLog(@"Write Ended");


}

但這不起作用......

我被卡住了,任何人都可以幫我這個???? :(

我已經找到了問題所在。

如果我們使用大尺寸的圖像它就不會工作。 喜歡從相機應用程序拍攝的照片有一個很大的尺寸。

所以我將它壓縮到低水平,然后它的工作..

我還沒有得到它的工作原因,但得到了解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM