Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

Konwersja mov do mp4 przy użyciu AVAssetExportSession


  • Zaloguj się, aby dodać odpowiedź
7 odpowiedzi w tym temacie

#1 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 07 listopada 2014 - 15:07

Stworzyłem prosty kod który zamienia pliki z mov na mp4. Tylko tyle że po konwersji plik mp4 jest znacznie mniejszej rozdzielczości co plik mov. Mam ustawioną AVAssetExportPreset1280x720 podczas tworzenia obiektu.

#2 Paweł Pałka

Paweł Pałka
  • 34 postów
  • SkądKatowice, Poland, Poland

Napisano 07 listopada 2014 - 16:31

Bez kodu ciężko, pokaż!

#3 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 12 listopada 2014 - 08:47

Mój kod:

- (void)convertMP4:(NSDictionary *)info //słownik wyniku nagrywania UIImagePickerController
{

  NSString *videoPath1 = @"";
  NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
  if (CFStringCompare((__bridge_retained CFStringRef)mediaType, kUTTypeMovie,
                      0) == kCFCompareEqualTo)
  {

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

    videoPath1 = [NSString stringWithFormat:@"%@/tempv.mov", docDir];

    NSData *videoData =
        [NSData dataWithContentsOfURL:
                    [info objectForKey:UIImagePickerControllerMediaURL]];

    [videoData writeToFile:videoPath1 atomically:NO];
  }

  CFRelease((__bridge CFStringRef)(mediaType)); // CRA

  AVURLAsset *avAsset =
      [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:videoPath1]
                          options:nil];

  NSArray *compatiblePresets =
      [AVAssetExportSession exportPresetsCompatibleWithAsset:avAsset];

  if ([compatiblePresets containsObject:AVAssetExportPreset1280x720])

  {

    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]
        initWithAsset:avAsset
           presetName:AVAssetExportPreset1280x720];

    exportSession.shouldOptimizeForNetworkUse = NO;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);

    NSString *videoPath =
        [NSString stringWithFormat:@"%@/test.mp4", [paths objectAtIndex:0]];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSError *error;
    BOOL success = [fileManager removeItemAtPath:videoPath error:&error];
    if (!success) {
      NSLog(@"Could not delete file -:%@ ", [error localizedDescription]);
    }

    self.mp4VideoPath = videoPath;

    exportSession.outputURL = [NSURL fileURLWithPath:videoPath];

    NSLog(@"videopath of mp4 file = %@", videoPath);

    exportSession.outputFileType = AVFileTypeMPEG4;
    [exportSession exportAsynchronouslyWithCompletionHandler:^{

        [[NSFileManager defaultManager] removeItemAtPath:videoPath1 error:nil];
        switch ([exportSession status]) {

        case AVAssetExportSessionStatusFailed:

          NSLog(@"Export failed:%@",
                [[exportSession error] localizedDescription]);

          break;

        case AVAssetExportSessionStatusCancelled:

          NSLog(@"Export canceled");

          break;

        case AVAssetExportSessionStatusCompleted:

          NSLog(@"%@", self.mp4VideoPath);

          self.audioVideoData = [NSData
              dataWithContentsOfURL:[NSURL fileURLWithPath:self.mp4VideoPath]];
          NSLog(@"Export completed ");
          break;
        default:

          break;
        }

    }];
  }
}


#4 Paweł Pałka

Paweł Pałka
  • 34 postów
  • SkądKatowice, Poland, Poland

Napisano 17 listopada 2014 - 09:26

Po pierwsze od iOS 8 nie zapisujesz nic w Directory, bo nie wbijesz się na App Store, gdyż od tego iOS Directory jest backupowane w iCloud, więc apple wymaga aby tam nic nie było, poza danymi użytkownika, np: model Cora Data. Używa Library/Cache

Nie pamiętam dużo z tego bo dawno nie robiłem, ale w dokumentacji stoi:

[COLOR=#808080][FONT=Menlo][SIZE=12px]+ ([/SIZE][/FONT][/COLOR][COLOR=#B833A1][FONT=Menlo][SIZE=12px]AVAssetExportSession *[/SIZE][/FONT][/COLOR][COLOR=#808080][FONT=Menlo][SIZE=12px])[/SIZE][/FONT][/COLOR][COLOR=#2E0D6E][FONT=Menlo][SIZE=12px]exportSessionWithAsset:[/SIZE][/FONT][/COLOR][COLOR=#808080][FONT=Menlo][SIZE=12px]([/SIZE][/FONT][/COLOR][COLOR=#6F41A7][FONT=Menlo][SIZE=12px][URL="https://developer.apple.com/LIBRARY/ios/documentation/AVFoundation/Reference/AVAsset_Class/index.html#//apple_ref/doc/c_ref/AVAsset"]AVAsset[/URL] *[/SIZE][/FONT][/COLOR][COLOR=#808080][FONT=Menlo][SIZE=12px])[/SIZE][/FONT][/COLOR][I]asset[/I]
[COLOR=#2E0D6E][FONT=Menlo][SIZE=12px]presetName:[/SIZE][/FONT][/COLOR][COLOR=#808080][FONT=Menlo][SIZE=12px]([/SIZE][/FONT][/COLOR][COLOR=#6F41A7][FONT=Menlo][SIZE=12px][URL="https://developer.apple.com/LIBRARY/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/index.html#//apple_ref/doc/c_ref/NSString"]NSString[/URL] *[/SIZE][/FONT][/COLOR][COLOR=#808080][FONT=Menlo][SIZE=12px])[/SIZE][/FONT][/COLOR][I]presetName[/I]

[COLOR=#6F41A7][FONT=Menlo][SIZE=12px]NSString[/SIZE][/FONT][/COLOR][COLOR=#000000][FONT=Menlo][SIZE=12px]*[/SIZE][/FONT][/COLOR][COLOR=#AA0D91][FONT=Menlo][SIZE=12px]const[/SIZE][/FONT][/COLOR][COLOR=#6F41A7][FONT=Menlo][SIZE=12px]AVAssetExportPresetLowQuality[/SIZE][/FONT][/COLOR][COLOR=#000000][FONT=Menlo][SIZE=12px];[/SIZE][/FONT][/COLOR]
[COLOR=#6F41A7][FONT=Menlo][SIZE=12px]NSString[/SIZE][/FONT][/COLOR][COLOR=#000000][FONT=Menlo][SIZE=12px]*[/SIZE][/FONT][/COLOR][COLOR=#AA0D91][FONT=Menlo][SIZE=12px]const[/SIZE][/FONT][/COLOR][COLOR=#6F41A7][FONT=Menlo][SIZE=12px]AVAssetExportPresetMediumQuality[/SIZE][/FONT][/COLOR][COLOR=#000000][FONT=Menlo][SIZE=12px];[/SIZE][/FONT][/COLOR]
[COLOR=#6F41A7][FONT=Menlo][SIZE=12px]NSString[/SIZE][/FONT][/COLOR][COLOR=#000000][FONT=Menlo][SIZE=12px]*[/SIZE][/FONT][/COLOR][COLOR=#AA0D91][FONT=Menlo][SIZE=12px]const[/SIZE][/FONT][/COLOR][COLOR=#6F41A7][FONT=Menlo][SIZE=12px]AVAssetExportPresetHighestQuality[/SIZE][/FONT][/COLOR][COLOR=#000000][FONT=Menlo][SIZE=12px];[/SIZE][/FONT][/COLOR]

Za presetName powinno być któreś z powyższych, sprawdzałeś to ?

#5 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 18 listopada 2014 - 09:35

Próbowałem wszystkich, nie działają największa wartość z tych to 320 × 568. Jedyne co znalazłem w sieci to zapisywać w formacie mp4 zamiast w mov
[FONT=Menlo][SIZE=11px]- ([COLOR=#bb2ca2]void[/COLOR])imagePickerController:([COLOR=#703daa]UIImagePickerController[/COLOR] *)picker[/SIZE][/FONT]
  [FONT=Menlo][SIZE=11px]    didFinishPickingMediaWithInfo:([COLOR=#703daa]NSDictionary[/COLOR] *)info[/SIZE][/FONT]

Tak z ciekawości to gdzie mogę zapisywać filmy tak żeby nie były przechowywane w albumie?

#6 Paweł Pałka

Paweł Pałka
  • 34 postów
  • SkądKatowice, Poland, Poland

Napisano 21 listopada 2014 - 11:40

[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

Pamiętać trzeba o czyszczeniu tego. Używam firstObject bo się nie sypnie, tylko walnie nil jak tabilica będzie pusta, a objectAtIndex się wysypie.

A i jedno jeszcze:
[FONT=Courier][SIZE=12px][paths objectAtIndex:0][/SIZE][/FONT]
zastąp sobie
paths[0];


#7 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 21 listopada 2014 - 13:00

Nie wiem czy dobrze mnie zrozumiałeś, chcę aby plik który stworze po konwersji zapisać w programie nie w rolce aparatu. W dokumentacji appla jest coś takiego "Only documents and other data that is user-generated, or that cannot otherwise be recreated by your application, should be stored in the /Documents directory and will be automatically backed up by iCloud." Zdjęć nie da się odtworzyć czyli można je przechowywać w tej lokacji (Oczywiście w jakimś katalogu), ewentualnie stworzyć katalog który ma flagę uniemożliwiającą backup w iCloud. Dobrze to rozumiem?

#8 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 24 listopada 2014 - 11:47

chyba wiem gdzie jest błąd przy przycinaniu jest zmieniany rozmiar, po mimo że mam tam ustawioną wartość UIImagePickerControllerQualityTypeIFrame1280x720 dla videoQuality.

testuje na iPhonei 5 i ios 7.1.2

    if ([UIVideoEditorController canEditVideoAtPath:self.videoPath]) {
      self.editor = [[UIVideoEditorController alloc] init];
      self.editor.videoPath = self.videoPath;//prawidłowa rozdzielczość
      self.editor.videoMaximumDuration = 180.0;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
      self.editor.videoQuality =
          UIImagePickerControllerQualityTypeIFrame1280x720;
 
#elif __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
      self.editor.videoQuality =
          UIImagePickerControllerQualityType640x480; // VGA quality
#endif
 
      self.editor.delegate = self;
 
      [self.navigationController presentViewController:self.editor
                                              animated:NO
                                            completion:nil];
    } else {
      NSLog(@"can't edit video at %@", self.videoPath);
    }

Użytkownik macQUB edytował ten post 02 grudnia 2014 - 15:09





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych