Ios 由于电影';s文件格式为';我认不出

Ios 由于电影';s文件格式为';我认不出,ios,objective-c,iphone,imagemagick,Ios,Objective C,Iphone,Imagemagick,我正在尝试从图像magick库提供的图像创建视频文件。在一个接一个地应用了一些效果(如不透明度差异)后,它被成功创建,但快速时间播放器给出错误“无法打开视频文件。无法识别电影的文件格式” 我正在使用以下代码: double d = 0.00; - (void)posterizeImageWithCompression:(id)sender { // Here we use JPEG compression. NSLog(@"we're using JPEG compressi

我正在尝试从图像magick库提供的图像创建视频文件。在一个接一个地应用了一些效果(如不透明度差异)后,它被成功创建,但
快速时间播放器
给出错误
“无法打开视频文件。无法识别电影的文件格式”

我正在使用以下代码:

double d = 0.00;

- (void)posterizeImageWithCompression:(id)sender {

    // Here we use JPEG compression.
    NSLog(@"we're using JPEG compression");

    MagickWandGenesis();
    magick_wand = NewMagickWand();
    magick_wand = [self magiWandWithImage:[UIImage imageNamed:@"iphone.png"]];

    MagickBooleanType status;

    status = MagickSetImageOpacity(magick_wand, d);

    if (status == MagickFalse) {
        ThrowWandException(magick_wand);
    }
    if (status == MagickFalse) {
        ThrowWandException(magick_wand);
    }
    size_t my_size;
    unsigned char * my_image = MagickGetImageBlob(magick_wand, &my_size);
    NSData * data = [[NSData alloc] initWithBytes:my_image length:my_size];
    free(my_image);
    magick_wand = DestroyMagickWand(magick_wand);
    MagickWandTerminus();
    UIImage * image = [[UIImage alloc] initWithData:data];

    d = d + 0.05;
    if (status == MagickFalse) {
        ThrowWandException(magick_wand);
    }

    NSData *data1;

    NSArray *paths;

    NSString *documentsDirectory,*imagePath ;

    UIImage *image1 = image;

    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    documentsDirectory = [paths objectAtIndex:0];

    imagePath = [documentsDirectory stringByAppendingPathComponent:[NSString   stringWithFormat:@"%f.png",d]];

    data1 = UIImagePNGRepresentation(image1);

    if (d <= 1.0 ) {

        [data1 writeToFile:imagePath atomically:YES];

        [imageViewButton setImage:image forState:UIControlStateNormal];

        // If ready to have more media data
         if (assetWriterPixelBufferAdaptor.assetWriterInput.readyForMoreMediaData) {
             CVReturn cvErr = kCVReturnSuccess;
             // get screenshot image!
             CGImageRef image1 = (CGImageRef) image.CGImage;

             // prepare the pixel buffer
             CVPixelBufferRef pixelsBuffer = NULL;

             // Lock pixel buffer address
             CVPixelBufferLockBaseAddress(pixelsBuffer, 0);

            // pixelsBuffer = [self pixelBufferFromCGImage:image1];

             CVPixelBufferUnlockBaseAddress(pixelsBuffer, 0);

             CFDataRef imageData= CGDataProviderCopyData(CGImageGetDataProvider(image1));
             NSLog (@"copied image data");
             cvErr = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                                  FRAME_WIDTH,
                                                  FRAME_HEIGHT,
                                                  kCVPixelFormatType_32BGRA,
                                                  (void*)CFDataGetBytePtr(imageData),
                                                  CGImageGetBytesPerRow(image1),
                                                  NULL,
                                                  NULL,
                                                  NULL,
                                                  &pixelsBuffer);
             NSLog (@"CVPixelBufferCreateWithBytes returned %d", cvErr);

             // calculate the time
             CFAbsoluteTime thisFrameWallClockTime = CFAbsoluteTimeGetCurrent();
             CFTimeInterval elapsedTime = thisFrameWallClockTime - firstFrameWallClockTime;
             NSLog (@"elapsedTime: %f", elapsedTime);
             CMTime presentationTime =  CMTimeMake (elapsedTime * TIME_SCALE, TIME_SCALE);

             // write the sample
             BOOL appended = [assetWriterPixelBufferAdaptor appendPixelBuffer:pixelsBuffer withPresentationTime:presentationTime];

             if (appended) {
                 NSLog (@"appended sample at time %lf", CMTimeGetSeconds(presentationTime));
             } else {
                 NSLog (@"failed to append");
                 [self stopRecording];
             }

             // Release pixel buffer
             CVPixelBufferRelease(pixelsBuffer);
             CFRelease(imageData);
         }
     }


}

QT播放器的信息量不大。通常,播放器会提供丢失的编解码器的名称。如果生成该文件并在QT播放失败时以编程方式在同一台计算机上播放,那么,无论出于何种原因,程序库可能看到的编解码器(因为它使用了该编解码器)显然未在操作系统中注册。在shell中,您可以执行一个“文件”并获取文件类型,可能还有编解码器。如果没有,您应该能够找到带有vlc、transcode或gstreamer的编解码器,然后按照苹果的说明直接下载并安装所需的编解码器到操作系统中。

那么您想从图像创建视频吗?您是否尝试过使用ffmpeg来实现此功能?我认为可能是因为呈现时间不正确。时间尺度的值是多少?你希望最后一部电影的FPS是多少?使用Image Magick有什么特别的原因吗?如果不是,这里有一个更好的从图像创建电影的方法:
VideoToolbox`vt_Copy_32BGRA_2vuyITU601 + 91 and 
VideoToolbox`vtPixelTransferSession_InvokeBlitter + 574 and 
VideoToolbox`VTPixelTransferSessionTransferImage + 14369 and 
VideoToolbox`VTCompressionSessionEncodeFrame + 1077 and 
MediaToolbox`sbp_vtcs_processSampleBuffer + 599