45 votes

iPhone: compresser par programme une vidéo enregistrée pour la partager?

J'ai mis en place une superposition de vue lors de l'appel de vue de la caméra avant l'enregistrement de la vidéo.

pickerController.cameraOverlayView =myOverlay;

L'enregistrement vidéo et l'enregistrement de la vidéo dans l'Album, après l'enregistrement de la vidéo et de la partager via e-mail, etc. tout fonctionne très bien.

Si j'utilise la qualité de la vidéo de "Haute qualité", puis la vidéo enregistrée est devenue énorme taille. Par exemple, si j'enregistre une vidéo de 30 secondes avec de haute qualité, la vidéo enregistrée est devenu autour de 30 40 mo.

pickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;

Comment puis-je programme pour compresser la grande qualité de la vidéo enregistrée avant de le partager, comme Apple le fait avec built-in de l'enregistreur Vidéo?

Merci de me guider pour résoudre ce problème.

Merci!

Mise à JOUR:

C'est ce que j'essaie récemment, mais toujours sans succès: je veux compresser la vidéo enregistrée prise, qui vient de didFinishPickingMediaWithInfo et de les stocker dans le même album photo vidéo en chemin lui-même, pas n'importe où ailleurs. J'ai testé la même vidéo est compressé à de très petite taille quand je pique la photo de la bibliothèque, mais la même vidéo prise à partir de la caméra et est venu via didFinishPickingMediaWithInfo n'est pas compressé, bien que j'ai utilisé le AVAssetExportSession code ci-dessous.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];


if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
{

    NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
    NSString *urlPath = [videoURL path];

    if ([[urlPath lastPathComponent] isEqualToString:@"capturedvideo.MOV"])
    {
        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (urlPath))
        {
            [self copyTempVideoToMediaLibrary :urlPath];


        }
        else
        {
            NSLog(@"Video Capture Error: Captured video cannot be saved...didFinishPickingMediaWithInfo()");                
        }
    }       
    else
    {
        NSLog(@"Processing soon to saved photos album...else loop of lastPathComponent..didFinishPickingMediaWithInfo()");
    }
}    
[self dismissModalViewControllerAnimated:YES];
}

- (void)copyTempVideoToMediaLibrary :(NSString *)videoURL {

        dispatch_queue_t mainQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(mainQueue, ^{

    ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];

    ALAssetsLibraryWriteVideoCompletionBlock completionBlock = ^(NSURL *assetURL, NSError *error) {
        NSLog(@"Saved URL: %@", assetURL);
        NSLog(@"Error: %@", error);

        if (assetURL != nil) {

            AVURLAsset *theAsset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:videoURL] options:nil];

            NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:theAsset];

            AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:theAsset presetName:AVAssetExportPresetLowQuality];

            [exportSession setOutputURL:[NSURL URLWithString:videoURL]];
            [exportSession setOutputFileType:AVFileTypeQuickTimeMovie];

            [exportSession exportAsynchronouslyWithCompletionHandler:^ {
                switch ([exportSession status]) {
                    case AVAssetExportSessionStatusFailed:
                        NSLog(@"Export session faied with error: %@", [exportSession error]);
                        break;
                    default:
                        //[self mediaIsReady];
                        break;
                }
            }];
        }
    };

    [library writeVideoAtPathToSavedPhotosAlbum:[NSURL URLWithString:videoURL] completionBlock:completionBlock];
});
}

68voto

jojaba Points 3915

Si vous êtes désireux de compresser la vidéo à distance pour le partage et pour garder la qualité d'origine pour le stockage local sur l'iPhone, vous devriez regarder dans AVAssetExportSession ou AVAssetWriter.

Lire aussi sur iOS gère des Actifs.

- (void)convertVideoToLowQuailtyWithInputURL:(NSURL*)inputURL 
                                   outputURL:(NSURL*)outputURL 
                                     handler:(void (^)(AVAssetExportSession*))handler
{
    [[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil];
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetLowQuality];
    exportSession.outputURL = outputURL;
    exportSession.outputFileType = AVFileTypeQuickTimeMovie;
    [exportSession exportAsynchronouslyWithCompletionHandler:^(void) 
    {
        handler(exportSession);
        [exportSession release];
    }];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

{   
    NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
    NSURL *outputURL = [NSURL fileURLWithPath:@"/Users/josh/Desktop/output.mov"];
    [self convertVideoToLowQuailtyWithInputURL:videoURL outputURL:outputURL handler:^(AVAssetExportSession *exportSession)
     {
         if (exportSession.status == AVAssetExportSessionStatusCompleted)
         {
             printf("completed\n");
         }
         else
         {
             printf("error\n");

         }
     }];

}

14voto

Alexey Kozhanov Points 291

Je suppose que la vidéo est déjà compressée par le codec h264. Mais vous pouvez essayer d'utiliser AVFoundation pour capturer les fichiers vidéo à partir de l'appareil photo. Mais je suppose que vous allez vous retrouver avec les mêmes tailles de fichiers.

Voici quelques statistiques pour le fichier vidéo de 10 secondes enregistré sur l'iPhone 4 avec des pressets de qualité différente.

 high (1280х720) = ~14MB = ~11Mbit/s
640 (640х480) = ~4MB = ~3.2Mbit/s
medium (360х480) = ~1MB = ~820Kbit/s
low (144х192) = ~208KB = ~170Kbit/s
 

13voto

Randall Points 6284
 pickerController.videoQuality = UIImagePickerControllerQualityTypeMedium;
 

Ce sont toutes les valeurs que vous pouvez choisir.

 UIImagePickerControllerQualityTypeHigh    = 0,
UIImagePickerControllerQualityType640x480 = 3,
UIImagePickerControllerQualityTypeMedium  = 1,  // default value
UIImagePickerControllerQualityTypeLow     = 2
 

4voto

SVMRAJESH Points 1685

Essayez ces quelques lignes:

     [[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil];
    AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:inputURL options:nil];
    AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset: urlAsset presetName:AVAssetExportPresetLowQuality];
    session.outputURL = outputURL;
    session.outputFileType = AVFileTypeQuickTimeMovie;
    [session exportAsynchronouslyWithCompletionHandler:^(void) 
    {
        handler(session);

    }];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X