【问题标题】:How to render a video file of fixed length from a still image (png)如何从静止图像(png)渲染固定长度的视频文件
【发布时间】:2020-04-22 01:44:08
【问题描述】:

我正在尝试从静止图像 (png) 创建指定长度的视频。 我的代码基于How do I export UIImage as a movie中给出的答案

我的代码创建了正确长度的视频,但图像直到最后一帧才会出现。我希望在视频的整个持续时间内显示图像。 (这些视频将成为无间隙时间线中的占位符。)

我的代码是:

- (NSURL*)exportImage:(NSImage*)image asMovieLength:(double)seconds {

    NSURL *outFile;
    AppDelegate *theApp;
    NSError *error=nil;
    AVAssetWriter *videoWriter;
    NSDictionary *videoSettings;
    AVAssetWriterInput* writerInput;
    CVPixelBufferRef buffer = NULL;
    AVAssetWriterInputPixelBufferAdaptor *adaptor;

    theApp = (AppDelegate*)[[NSApplication sharedApplication] delegate];

    outFile = [theApp getFilenameForFillerFile];

    videoWriter = [[AVAssetWriter alloc] initWithURL:outFile fileType:AVFileTypeMPEG4 error:&error];
    NSParameterAssert(videoWriter);

    videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecH264, AVVideoCodecKey,
                     [NSNumber numberWithInt:880], AVVideoWidthKey,
                     [NSNumber numberWithInt:880], AVVideoHeightKey,
                     nil];

    writerInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings];

    adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
                                                                               sourcePixelBufferAttributes:nil];

    NSParameterAssert(writerInput);
    NSParameterAssert([videoWriter canAddInput:writerInput]);
    [videoWriter addInput:writerInput];

    // Start the writing session
    [videoWriter startWriting];
    [videoWriter startSessionAtSourceTime:kCMTimeZero];


    if(writerInput.readyForMoreMediaData)
    {
        CMTime zeroTime = CMTimeMake(0, 600);
        CMTime frameTime = CMTimeMake(seconds*600, 600);
        buffer = [self pixelBufferFromImage:image];

        [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];

        [writerInput markAsFinished];

        [videoWriter finishWritingWithCompletionHandler:^{
            NSLog(@"Finished writing...checking completion status...");
            if (videoWriter.status != AVAssetWriterStatusFailed && videoWriter.status == AVAssetWriterStatusCompleted)
            {
                NSLog(@"Video writing succeeded.");

            } else
            {
                NSLog(@"Video writing failed: %@", videoWriter.error);
            }

        }];

        CVPixelBufferPoolRelease(adaptor.pixelBufferPool);

        NSLog (@"Done");
    }

    return outFile;
}

如何让图像从一开始就显示,并持续指定的时间?

【问题讨论】:

    标签: objective-c macos avfoundation nsimage avkit


    【解决方案1】:

    在您的代码更改之后对我有用。

    CMTime zeroTime = CMTimeMake(0, 600);
    CMTime frameTime = CMTimeMake((seconds * 0.5) * 600, 600);
    
    buffer = [self pixelBufferFromImage:image];
    
    [adaptor appendPixelBuffer:buffer withPresentationTime:zeroTime];
    [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];
    

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      相关资源
      最近更新 更多