2016-07-08 26 views
9

Sto lavorando a un'app che richiede la modifica dei video (impostazione degli overlay). Ora, mentre i video ripresi dagli iPhone vengono modificati bene, quelli sparati dai telefoni Android stanno diventando vuoto dopo la modifica.I video ripresi dai telefoni Android si sono rovinati dopo l'editing con AVFoundation iOS

Non riesco a immaginare quale potrebbe essere il problema. Gradirei un aiuto immediato.

Questo è uno dei metodi (funzionalità Trim).

- (IBAction)cutButtonTapped:(id)sender { 

    hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    hud.mode = MBProgressHUDModeText; 
    hud.labelText = @"Encoding..."; 

    [self.playButton setBackgroundImage:[UIImage imageNamed:@"video_pause.png"] forState:UIControlStateNormal]; 



    NSString *uniqueString = [[NSProcessInfo processInfo]globallyUniqueString]; 

//do this to export video 
    NSURL *videoFileUrl = [NSURL fileURLWithPath:[AppHelper userDefaultsForKey:@"videoURL"]]; 

    AVAsset *anAsset = [[AVURLAsset alloc] initWithURL:videoFileUrl options:nil]; 
    NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:anAsset]; 

    if ([compatiblePresets containsObject:AVAssetExportPresetMediumQuality]) { 

     self.exportSession_ = [[AVAssetExportSession alloc] 
          initWithAsset:anAsset presetName:AVAssetExportPresetPassthrough]; 
    // Implementation continues. 

    //  NSURL *furl = [self newURLWithName:[uniqueString stringByAppendingString:@".mov"]]; 
      NSURL *furl = [self newURLWithName:[uniqueString stringByAppendingString:[NSString stringWithFormat:@".%@",[videoFileUrl pathExtension]]]]; 

    self.exportSession_.outputURL = furl; 
    self.exportSession_.outputFileType = AVFileTypeMPEG4; 

    CMTime start = CMTimeMakeWithSeconds(self.startTime, anAsset.duration.timescale); 
    CMTime duration = CMTimeMakeWithSeconds(self.stopTime-self.startTime, anAsset.duration.timescale); 
    CMTimeRange range = CMTimeRangeMake(start, duration); 
    CMTimeShow(self.exportSession_.timeRange.duration); 
    self.exportSession_.timeRange = range; 
    CMTimeShow(self.exportSession_.timeRange.duration); 

    [self.exportSession_ exportAsynchronouslyWithCompletionHandler:^{ 

     switch ([self.exportSession_ status]) { 
      case AVAssetExportSessionStatusFailed: 
       NSLog(@"Export failed: %@", [[self.exportSession_ error] localizedDescription]); 
       break; 
      case AVAssetExportSessionStatusCancelled: 
       NSLog(@"Export canceled"); 
       break; 
      default: 
       NSLog(@"NONE"); 
       dispatch_async(dispatch_get_main_queue(), ^{ 

//       [self playDocumentDirectoryVideoWithURLString:[uniqueString stringByAppendingString:@".mov"]]; 
         [self playDocumentDirectoryVideoWithURLString:[uniqueString stringByAppendingString:[NSString stringWithFormat:@".%@",[videoFileUrl pathExtension]]]]; 

       }); 
     } 
    }]; 
} 

}

Qualcuno potrebbe aiutarmi con questo?

+0

C'è una cosa che non capisco: Avete un problema con il vostro iOS o fare il vostro avere un problema con la tua applicazione Android ? Voglio dire, quello che capisco è che hai un problema con i video che sono stati girati da un telefono Android quando vuoi modificare questi video su un iPhone. Ma penso che il tuo problema sia: la tua app per iOS funziona bene, la tua app per Android no. – Randy

+0

Nell'app per Android non esiste questo tipo di file.FFMPEG è stato utilizzato per l'intero processo di editing video. Ma in app iOS, ho utilizzato AVFoundation per eseguire tutte le attività di editing video (taglio, velocità, sovrapposizione, fusione). funziona bene per i video presi da iPhone, ma non per i video presi da Android. – Reckoner

+0

Puoi mostrarci il tuo codice? – Randy

risposta

1

Prima di tutto, ti consiglio di controllare i valori duration & range. Sembra un problema con CMTime e decodifica. E in secondo luogo, cercare di inizializzare il vostro AVURLAsset con un'opzione per forzare l'estrazione Durata:

AVAsset *anAsset = [[AVURLAsset alloc] initWithURL:videoFileUrl options:@{AVURLAssetPreferPreciseDurationAndTimingKey: @(YES)}]; 
+0

Ancora lo stesso problema. – Reckoner

+0

Qualche possibilità, è possibile allegare il video prima dell'elaborazione e dopo? – dive

+0

Sì, lo attaccherò più tardi oggi.Ma immagino di aver trovato il problema.Il problema è che quando provo a regolare l'istruzioneLayer per regolare l'orientamento del video, incontro questo problema.Ma la domanda è: perché solo su video Android ? – Reckoner