2016-04-22 50 views
0

得到的NSData鑑於這樣的網址:如何從視頻文件在磁盤上

file:///private/var/mobile/Applications/C133BAE7-0CBC-4E4F-826B-509B5E1EB68E/tmp/uzhMyDkL0mSI-SCVideo-Merged.mov 

我怎樣才能得到這個NSData的表示發送到服務器?我試過所有這些:

NSData *videoData = [NSData dataWithContentsOfURL:url]; 
NSData *videoData = [NSData dataWithContentsOfFile:[url absoluteString]]; 
NSData *videoData = [[NSFileManager defaultManager] contentsAtPath:[url path]]; 

videoData每次都是零。

編輯: 對於更多的上下文,我試圖用SCRecorder捕捉視頻。

- (void)recorder:(SCRecorder *__nonnull)recorder didCompleteSegment:(SCRecordSessionSegment *__nullable)segment inSession:(SCRecordSession *__nonnull)session error:(NSError *__nullable)error { 

    [session mergeSegmentsUsingPreset:AVAssetExportPresetHighestQuality completionHandler:^(NSURL *url, NSError *error) { 
     if (error == nil) { 
      //NSData *videoData = [NSData dataWithContentsOfURL:url]; 
      //NSData *videoData = [NSData dataWithContentsOfFile:[url absoluteString]]; 
      NSData *videoData = [[NSFileManager defaultManager] contentsAtPath:[url path]]; 

     } else { 
      NSLog(@"Bad things happened: %@", error); 
     } 
    }]; 

} 
+1

你是如何獲得URL的? – rmaddy

+0

是否可以在開頭或網址有三個斜槓? – heximal

+1

@heximal - 'file:///'scheme中的第三個斜槓實際上是指定設備文件系統的根目錄。把它想成是指「'/ private/var/mobile ...'」 –

回答

1

文件的URL看起來是正確的我,但要真正確定,你必須在這個方法中添加試圖獲取NSData的面前:

NSError *error = nil; 
if ([url checkResourceIsReachableAndReturnError: &error] == FALSE) 
{ 
    NSLog(@"URL %@ is not available because %@", [url absoluteString], [error localizedDescription]); 
} 

您也可以嘗試通過獲取該文件:

NSError *error = nil; 
NSData *videoData = [NSData dataWithContentsOfURL:url 
           options: NSDataReadingUncached 
           error:&error]; 
if (videoData == nil) 
{ 
    NSLog(@"URL %@ is not available because %@", [url absoluteString], [error localizedDescription]); 
} else { 
    // you've likely got data, since videoData is not nil! 
} 
0

這是不可思議的,但如果我這樣做它的工作原理:

- (void)recorder:(SCRecorder *__nonnull)recorder didCompleteSegment:(SCRecordSessionSegment *__nullable)segment inSession:(SCRecordSession *__nonnull)session error:(NSError *__nullable)error { 

    [session mergeSegmentsUsingPreset:AVAssetExportPresetHighestQuality completionHandler:^(NSURL *url, NSError *error) { 
     if (error == nil) { 
      [self getDataFromUrl:url]; 
     } else { 
      NSLog(@"Bad things happened: %@", error); 
     } 
    }]; 

} 

- (void)getDataFromUrl:(NSURL *)url { 
    NSError *error = nil; 
    NSData *videoData = [NSData dataWithContentsOfURL:url 
               options:NSDataReadingUncached 
               error:&error]; 
    if (videoData == nil) 
    { 
     NSLog(@"URL %@ is not available because %@", [url absoluteString], [error localizedDescription]); 
    } else { 
     NSLog(@"GOT IT"); 
    } 
} 

videoData現在是有效的NSData。如果分離到不同的方法,爲什麼這會起作用的任何解釋?

+0

如果您直接刪除'getDataFromURL:'方法並直接在'mergeSegmentsUsingPreset:'方法內調用'dataWithContentsOfURL:options:error:'會發生什麼? – rmaddy

+0

它的工作原理。因此'dataWithContentsOfURL'不起作用,但'dataWithContentsOfURL:options:error:'does ... – soleil

+0

它可能與您傳入的選項有關。它可能與文件的大小有關。文件有多大? – rmaddy