2015-01-30 11 views
12

Próbuję to zrobić, używając AVAsset, aby nagrać plik audio, a następnie po pierwszym zapisaniu go na NSFileManager, a następnie po konwersji przez nsdata i Call API, aby go zapisać. .Jak przekonwertować zestaw AVA do NSData lub zapisać go do menedżera plików

Udało mi się utworzyć plik nagrania AVAsset i odtworzyć go przy użyciu trzeciej klasy, która jest SCPlayer.

Problem polega na tym, że nie wiem, jak użyć pliku AVAsset, aby zapisać go w menedżerze plików, a następnie po wywołaniu interfejsu API wysłać go, przekształcając go na NSData.

Czy istnieje jakiś sposób przekonwertowania AVAsset na NSData ???

proszę o pomoc ...

+0

napisałem rozwiązanie tego Problem tutaj: http://stackoverflow.com/questions/37611488/how-to-stream-a-video-with-avurlasset-and-save-to-disk-the-cached-data/37611489#37611489 Dla mnie to nie działa tylko z AVAssetExportSession. Dodałem także AVAssetResourceLoaderDelegate, aby działało. –

Odpowiedz

18

można wykonać następujące czynności:

  1. Zastosowanie AVAssetExportSession wyeksportować obiekt AVAsset do pliku ścieżka URL.
  2. Konwersja na NSData przy użyciu metody dataWithContentsOfURL .

    
    NSURL *fileURL = nil; 
    __block NSData *assetData = nil; 
    
    // asset is you AVAsset object 
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality]; 
    
    exportSession.outputURL = fileURL; 
    // e.g .mov type 
    exportSession.outputFileType = AVFileTypeQuickTimeMovie; 
    
    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
        assetData = [NSData dataWithContentsOfURL:fileURL]; 
        NSLog(@"AVAsset saved to NSData."); 
    }]; 
    
  3. Nie zapomnij posprzątać pliku wyjściowego po wykonaniu co trzeba z nim zrobić;)

+0

Dzięki temu jest to naprawdę pomocne ... :) –

+0

Nie ma za co. @DhavalTannarana – itsProf

+0

Myślę, że to jest sposobem, ponieważ inicjowanie NSData z adresu URL biblioteki nie jest akceptowane (zwraca zero NSData) – onmyway133

3

Można spojrzeć na AVAssetExportSession

AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality]; 
exporter.outputURL = exportUrl; 

[exporter exportAsynchronouslyWithCompletionHandler:^{ 
    // here your file will be saved into file system at specified exportUrl 
}]; 
+1

To działało dla mnie, ale musiałem dodać następującą linię: 'exporter.outputFileType = AVFileTypeMPEG4;' ponieważ outputFileType nie może być NULL – cph2117

5

Swift 3

let manager = PHImageManager.default()  
manager.requestAVAsset(forVideo: asset, options: nil, resultHandler: { (avasset, audio, info) in 
       if let avassetURL = avasset as? AVURLAsset { 
        guard let video = try? Data(contentsOf: avassetURL.url) else { 
         return 
        } 
        videoData = video 
       } 
      }) 
+0

Nie wymaga sesji eksportu. Czy obiekt NSData jest rzeczywiście odtwarzalny po użyciu tej metody? – HackaZach