2

一連の画像からビデオを作成しようとしていたところ、いくつかのコードを見つけて動作させました

しかし、ビデオは写真ライブラリに保存されず、次のエラーが表示されます:

Documentsa.mov を保存した写真アルバムに保存できません: エラー Domain=NSOSStatusErrorDomain Code=2 "このムービーを再生できませんでした。" UserInfo=0x922cf60 {NSLocalizedDescription=このムービーは再生できませんでした。}

私が使用するコードは次のとおりです。

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

    UIImage * i = [UIImage imageNamed:@"IMG_1650.JPG"];
    CGAffineTransform  transform = CGAffineTransformMakeRotation((M_PI/180)*90);
    GPUImageTransformFilter * filter = [[GPUImageTransformFilter alloc]init];
    [filter setAffineTransform:transform];
   UIImage * im = [filter imageByFilteringImage:i];
    im = [filter imageByFilteringImage:im];

    [self writeImagesToMovieAtPath:[NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,@"a.mov"] withSize:CGSizeMake(i.size.width, i.size.height)];

    NSString* exportVideoPath = [NSString stringWithFormat:@"%@%@",documentsDirectoryPath,@"a.mov"];

    UISaveVideoAtPathToSavedPhotosAlbum (exportVideoPath,self, @selector(video:didFinishSavingWithError: contextInfo:), nil);

そして、これは私がビデオを作成するために使用するコードです:

-(void) writeImagesToMovieAtPath:(NSString *) path withSize:(CGSize) size
{
    NSLog(@"Write Started");

    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* 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 = 1;
    int kRecordingFPS = 30;
    UIImage * im = [UIImage imageNamed:@"IMG_1650.JPG"];

    CGAffineTransform  transform = CGAffineTransformMakeRotation((M_PI/180)*90);
    GPUImageTransformFilter * filter = [[GPUImageTransformFilter alloc]init];
    [filter setAffineTransform:transform];
    UIImage * i = [filter imageByFilteringImage:im];
    i = [filter imageByFilteringImage:im];
    NSArray * imageArray = [[NSArray alloc]initWithObjects:i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i, nil];

    for(UIImage * img in imageArray)
    {
        buffer = [self pixelBufferFromCGImage:[img 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 = CMTimeMake(frameCount,(int32_t) kRecordingFPS);
                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++;
    }


    //Finish the session:
    [videoWriterInput markAsFinished];
    [videoWriter finishWriting];
    NSLog(@"Write Ended");
}

を使用してビデオが互換性があるかどうかを確認しようとしました

UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(videoPath)

ビデオに互換性がないことがわかりました

しかし、これを修正する理由や方法がわかりません

4

3 に答える 3

1

ビデオパス

NSString* exportVideoPath = [NSString stringWithFormat:@"%@%@",documentsDirectoryPath,@"a.mov"]; 

間違っている。「/」セパレーターがありません。

これに変更

NSString* exportVideoPath = [NSString stringWithFormat:@"%@/%@",documentsDirectoryPath,@"a.mov"]; 

これで問題が解決することを願っています。

于 2013-02-26T10:57:24.317 に答える
0

克服するとはどういう意味ですか? ファイルをドキュメントから任意のバックエンド サーバーに送信して保存することは問題ないと思います。また、より優れたビデオ サポートを備えた他のデバイスで再生することもできます。ただし、OS の制限を超えることは、「ハッキング」によって可能であってもうまくいかない可能性があります。

つまり、ライブラリのメディアは再生可能でなければならないため、1080p がライブラリにある最大のビデオ ファイル解像度です。それでも、アプリのドキュメントにファイルを保存して手動でデコードすることはできますが、これは興味深いタスクのように思えます :) ただし、大量のトラフィック リークによって顧客が狂ってしまうのを避けるために、iCloud と同期しないようにしてください。

于 2012-10-23T13:38:53.427 に答える
0

以前のコメントで A-Live による解決策を試しました

問題は、画像のサイズが大きすぎることであることが判明しました

これを克服する方法はありますか?

于 2012-10-23T10:51:11.457 に答える