Приложение «Сохранить видео на iPad» - PullRequest
1 голос
/ 20 декабря 2010

Я пытался использовать UISaveVideoAtPathToSavedPhotosAlbum для сохранения моего видео (хранящегося локально в приложении). Но когда я пытаюсь сохранить его, я получаю сообщение об ошибке «Операция не выполнена, поскольку видеофайл недействителен и не может быть воспроизведен» Файл занимает всего около минуты и является файлом .mp4. У меня нет проблем, играя с MPMoviePlayer, просто не сохранится. Вот код:

NSString *path = [[NSBundle mainBundle] pathForResource:@"videoFile" ofType:@"mp4"];
UISaveVideoAtPathToSavedPhotosAlbum(path, self, @selector(status:didFinishSavingWithError:contextInfo), nil);

Разве этот метод не предназначен для работы на iPad? Там написано "SavedPhotosAlbum". Означает ли это, что мне нужно будет просмотреть приложение с фотографиями, чтобы просмотреть его, или это просто название метода, и оно будет в приложении «Видео»? Если бы вы могли помочь мне разобраться с этим, я был бы очень признателен.

Ответы [ 2 ]

4 голосов
/ 07 сентября 2011

Вот более простой рабочий код из одного из моих проектов, который должен сохранять фильм / видео в фотоальбоме, если он существует ниже filePathString и совместим с фотоальбомом для устройства. Я предполагаю, что при указанном пути к файлу либо не было файла, либо (что более вероятно) размер и формат фильма были несовместимы с фотоальбомом для iPad / iPhone. Подробнее см. Вопрос о видеоформатах, совместимых с фотоальбомами устройства iOS.

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
// don't forget to link to the AssetsLibrary framework 
// and also #import <AssetsLibrary/AssetsLibrary.h>

NSString *filePathString = [[NSBundle mainBundle] pathForResource:@"videoFile" ofType:@"mp4"];
NSURL *filePathURL = [NSURL fileURLWithPath:filePathString isDirectory:NO];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:filePathURL]) {
    [library writeVideoAtPathToSavedPhotosAlbum:filePathURL completionBlock:^(NSURL *assetURL, NSError *error){
        if (error) {
            // TODO: error handling
        } else {
            // TODO: success handling
        }
    }];
}
[library release];
1 голос
/ 20 декабря 2010

Это должно работать до тех пор, пока UIVideoAtPathIsCompatibleWithSavedPhotosAlbum () вернет true. Тем не менее, у меня была эта проблема раньше, и мне, кажется, повезло больше, создавая объект ALAssetsLibrary, а затем используя метод:

- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock

Я не пытался отредактировать это как универсальное или на 100% переносимое. Я только что взял код, который написал для сохранения видео, чтобы дать вам хорошую отправную точку для использования ALAssetLibrary вместо:

- (void) saveVideoFile:(NSString *)fullpathVideoFile completionTarget:(id)theCompletionTarget action:(SEL)theCompletionAction context:(id)theContext
    {
    writeFailed = NO;

    completionTarget = theCompletionTarget;
    completionAction = theCompletionAction;
    completionContext = theContext;

    //  ALAssetsLibraryWriteVideoCompletionBlock
    //
    void (^completionBlock)(NSURL *, NSError *) = ^(NSURL *assetURL, NSError *error)
        {
        if ( error != nil )
            {
            writeFailed = YES;
            }

        writingToLibrary = NO;

        [self notifyCompletionTarget];
        };


    // clean up from previous calls
    //  
    if ( assetURL != nil )
        {
        [assetURL release];
        assetURL = nil;
        }

    if ( assetFullPathName != nil )
        {
        [assetFullPathName release];
        assetFullPathName = nil;
        }

    writingToLibrary = YES;


    // make sure we have a good file
    //
    if ( [[NSFileManager defaultManager] fileExistsAtPath:fullpathVideoFile] == NO)
        {
        writingToLibrary = NO;
        writeFailed = YES;
        [self notifyCompletionTarget];
        return;
        }


    // set assetURL for sending to the library
    //
    assetFullPathName = [[NSMutableString alloc] initWithCapacity:(NSUInteger)1024];
    [assetFullPathName setString:fullpathVideoFile];

    assetURL = [[NSURL alloc] initFileURLWithPath:assetFullPathName isDirectory:NO];


    // Use possible alternative method if this method doesn't want to work
    //
    if ( [library videoAtPathIsCompatibleWithSavedPhotosAlbum:assetURL]==NO )
        {
        if ( UIVideoAtPathIsCompatibleWithSavedPhotosAlbum( assetFullPathName ) )
            {
            UISaveVideoAtPathToSavedPhotosAlbum( assetFullPathName, self, @selector(video:didFinishSavingWithError:contextInfo:), nil );
            }
        else
            {
            writingToLibrary = NO;
            writeFailed = YES;
            [self notifyCompletionTarget];
            }

        return;
        }


    // Write the video to the library
    //
    [library writeVideoAtPathToSavedPhotosAlbum:assetURL completionBlock:completionBlock];
    }
...