如何显示图像中的视频 [英] How to display video from images

查看:92
本文介绍了如何显示图像中的视频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

    #import "ViewController.h"
    #import "AVFoundation/AVAssetWriter.h"
    #import "AVFoundation/AVAssetWriterInput.h"
    #import "AVFoundation/AVMediaFormat.h"
    #import "AVFoundation/AVVideoSettings.h"


    @implementation ViewController

    - (void)viewDidLoad
    {
        [super viewDidLoad];

         NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentDirectory = [documentDirectories objectAtIndex: 0];

       // NSLog(@"Where it is %@ \n",documentDirectory);
        image1.image = [UIImage imageNamed:@"images1.jpg"];
         CGSize sizeOfImage = image1.image.size;
        // printf("Size of Image width = %f  height = %f\n", sizeOfImage.width,sizeOfImage.height);
        [self writeImageAsMovie:(UIImage*)image1.image toPath:(NSString*)documentDirectory size:(CGSize)sizeOfImage duration:6];

    }


    - (void)writeImageAsMovie:(UIImage*)image toPath:(NSString*)path size:(CGSize)size duration:(int)duration 
    {
        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 *writerInput = [AVAssetWriterInput
                                           assetWriterInputWithMediaType:AVMediaTypeVideo
                                           outputSettings:videoSettings];




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


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

        //Start a session:
        [videoWriter startWriting];

        [videoWriter startSessionAtSourceTime:kCMTimeZero];

        //Write samples:
        //CVPixelBufferRef Utils;
        CVPixelBufferRef buffer = [self newPixelBufferFromCGImage:image.CGImage size:size];
        [adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero];



        [adaptor appendPixelBuffer:buffer withPresentationTime:CMTimeMake(duration-1, 2)];


        //Finish the session:
        [writerInput markAsFinished];
        [videoWriter endSessionAtSourceTime:CMTimeMake(duration, 2)];



       [videoWriter finishWriting]; 


    } 

-(CVPixelBufferRef) newPixelBufferFromCGImage:(CGImageRef)image size:(CGSize )frameSize
{
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                             [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                             nil];


    CVPixelBufferRef pxbuffer = NULL;


    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, frameSize.width, frameSize.height, kCVPixelFormatType_32ARGB,(__bridge CFDictionaryRef)options,&pxbuffer);

    NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);

    status = CVPixelBufferLockBaseAddress(pxbuffer, 0);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
    NSParameterAssert(pxdata != NULL);

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pxdata, frameSize.width,
                                                 frameSize.height, 8, 4*frameSize.width, rgbColorSpace, 
                                                 kCGImageAlphaNoneSkipFirst);
    NSParameterAssert(context);
    CGAffineTransform frameTransform;
    CGContextConcatCTM(context, frameTransform);
    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
                                           CGImageGetHeight(image)), image);
    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);


    return pxbuffer;
} 


@end

我是iOS上的新手,我已经看到了一个代码,该代码可显示来自堆栈溢出图像的视频.我运行代码,它没有显示任何错误,但没有得到所需的输出.我认为错误是此函数的最后一行

I am new on iOS and i have seen a code which display video from images in stack overflow. I run the code and it didn't show any errors but i didn't get required output. I think the error is last line of this function

-(void)writeImageAsMovie:(UIImage*)image toPath:(NSString*)path size:(CGSize)size duration:(int)duration) that is [videoWriter finishWriting]

请帮助我.

推荐答案

如果您有一个图像数组,并且只是将这些图像作为视频播放,则可以使用UIImageView并将该数组中的图像更新为图像视图使用for循环.

If you have an array of images and just to play these images as an video, you can use an UIImageView and update the images in the array to the image view using a for loop.

如果阵列中有图像. 喜欢,

If you have images in the array. Like,

for (int i = 0; i < [array count]; i++)
{    
    imageview.image = (UIImage *)[array objectAtIndex:i];
}

这篇关于如何显示图像中的视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆