Создание видео из массива изображений в ios создание, но не воспроизводится гладко

Я разрезаю видео кадр за кадром и затем даю эффект в кадре (используя aviary SDK), а затем создаю видео из этих изображений.

Хорошо, мой код создает видео с ожидаемой продолжительностью, но когда я играю это видео, оно будет воспроизводиться медленно (не плавно).

Вот мой код

- (IBAction)generateVideo:(id)sender
{
    NSLog(@"Enter in generateVideo Action");

    NSString *videoPath = [[Util mySaveFileToPath] stringByAppendingString:@"/video2.mp4"];

    UIImage * img = (UIImage *)[arrFramesOfVideo objectAtIndex:0];

    [self exportImages:arrFramesOfVideo asVideoToPath:videoPath withFrameSize:img.size framesPerSecond:framePerSec numberOfSecondsPerFrame:(1/framePerSec)];
}

Хорошо, что я получаю в то время, когда я выбираю кадры из видео, используя AVAssetTrack, так что я думаю, что нет никаких проблем с этим.

- (void)exportImages:(NSMutableArray *)imageArray asVideoToPath:(NSString *)videoOutputPath withFrameSize:(CGSize)imageSize framesPerSecond:(float)fps numberOfSecondsPerFrame:(float)numberOfSecondsPerFrame
{
    NSError *error = nil;
    NSLog(@"Start building video from defined frames.");
    NSLog(@"Video Path = %@",videoOutputPath);
    AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:videoOutputPath] fileType:AVFileTypeQuickTimeMovie error:&error];


    NSParameterAssert(videoWriter);

    NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                               AVVideoCodecH264, AVVideoCodecKey,
                               [NSNumber numberWithInt:imageSize.width], AVVideoWidthKey,
                               [NSNumber numberWithInt:imageSize.height], AVVideoHeightKey,
                               nil];

    AVAssetWriterInput* videoWriterInput = [AVAssetWriterInput
                                        assetWriterInputWithMediaType:AVMediaTypeVideo
                                        outputSettings:videoSettings];

    NSLog(@"videoWriterInput == %@",videoWriterInput);
    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;
    //double numberOfSecondsPerFrame = 6;
    double frameDuration = fps * numberOfSecondsPerFrame;

    //for(VideoFrame * frm in imageArray)
    NSLog(@"**************************************************");
    //for(UIImage * img in imageArray)
    for (int i = 0; i < arrFramesOfVideo.count; i++)
    {
        //NSLog(@"in loop");
        UIImage * img = (UIImage *)[arrFramesOfVideo objectAtIndex:i];
        buffer = [self pixelBufferFromCGImage:[img CGImage]];
        //dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.001 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        if (adaptor.assetWriterInput.readyForMoreMediaData)
        {  
            NSLog(@"frameCount == %d",frameCount);
            CMTime frameTime = CMTimeMake(i*numberOfSecondsPerFrame * 10000,10000);
            //CMTime frameTime = CMTimeMakeWithSeconds(frameCount*numberOfSecondsPerFrame, fps);
            CMTimeShow(frameTime);
            //CMTime frameTime = CMTimeMake(frameCount*frameDuration,fps);
            [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];
            frameCount ++;
            CVPixelBufferRelease(buffer);
        }
        else
        {
            i--;
            NSLog(@"adaptor not ready.");
            [NSThread sleepForTimeInterval:0.0001];
        }

    //});
    }
    NSLog(@"**************************************************");

    //Finish the session:
    [videoWriterInput markAsFinished];
    //[videoWriter finishWriting];

    [videoWriter finishWritingWithCompletionHandler:^{

        if (videoWriter.status == AVAssetWriterStatusFailed)
        {
            NSLog(@"Movie Save Failed.");
        }
        else
        {
            NSLog(@"Movie Saved.");
        }

    }];

    NSLog(@"Write Ended");
    NSLog(@"Video Path = %@",videoOutputPath);
}

И другой код по умолчанию для получения буфера, я не думаю, что это требуется в этом вопросе, потому что это распространено (без каких-либо изменений).

Если кто-то сделал это, пожалуйста, помогите мне, я потратил один день на это, но все еще не нашел никакого решения

Спасибо!

0 ответов

Другие вопросы по тегам