2014-03-03 5 views
1

ALASSET에서 비디오 URL을 받았는데 convertVideoToLowQuailtyWithInputURL 비디오를 압축하는 기능이 있지만 작동하지 않습니다. 나는 비디오의 크기가 항상 0iOS의 ALASSET URL에서 동영상을 압축 할 수 없습니까?

이다, 압축 후 본이 ALASSET에서 동영상 URL을 얻을 수있는 기능입니다 :

ALAsset *alasset = [allVideos objectAtIndex:i]; 
      ALAssetRepresentation *rep = [alasset defaultRepresentation]; 
      NSString * videoName = [rep filename]; 

      //compress video data before uploading 
      NSURL *videoURL = [rep url]; 
      NSLog(@"videoURL is %@",videoURL); 


      NSURL *uploadURL = [NSURL fileURLWithPath:[[NSTemporaryDirectory() stringByAppendingPathComponent:videoName] stringByAppendingString:@".mov"]]; 
      NSLog(@"uploadURL temp is %@",uploadURL); 

      // Compress movie first 
      [self convertVideoToLowQuailtyWithInputURL:videoURL outputURL:uploadURL handler:^(AVAssetExportSession *session) 
      { 
       if (session.status == AVAssetExportSessionStatusCompleted) 
       { 
        // Success 
       } 
       else 
       { 
        // Error Handing 

       } 
      }]; 

      NSString *path = [uploadURL path]; 
      NSData *data = [[NSFileManager defaultManager] contentsAtPath:path]; 
      NSLog(@"size after compress video is %d",data.length); 
     } 

기능 압축 비디오 :

- (void)convertVideoToLowQuailtyWithInputURL:(NSURL*)inputURL 
            outputURL:(NSURL*)outputURL 
            handler:(void (^)(AVAssetExportSession*))handler 
{ 
    [[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); 

    }]; 
} 

내가 convertVideoToLowQuailtyWithInputURL 함수를 호출, 나는 그것이 handler(session);에 방아쇠를 당기는 것을 보지 못했습니다.

그리고 NSLog(@"size after compress video is %d",data.length);은 항상 "크기가 0"입니다. 내가 잘못 갔습니까? 제게 조언 해주세요. 미리 감사드립니다.

답변

2

convertVideoToLowQuailtyWithInputURL은 비동기 메서드이므로 완료 처리기 블록을 사용합니다. 현재 로깅 코드는 완료 핸들러 블록에 없지만 convertVideoToLowQuailtyWithInputURL을 호출 한 후입니다. convertVideoToLowQuailtyWithInputURL 완료 전에 실행되므로 결과가 전혀 나오지 않습니다.

압축 된 비디오의 로깅 (및 사용)을 완료 블록으로 이동하십시오.

2
ALAssetRepresentation* representation = [asset defaultRepresentation]; 
NSString *fileName = [NSString stringWithFormat:@"VGA_%@",representation.filename]; //prepend with _VGA to avoid overwriting original. 
NSURL *TempLowerQualityFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:fileName] ]; 
NSURL *gallery_url = representation.url; 
NSLog(@" \r\n PRE-CONVERSION FILE %@ Size =%lld ; URL=%@\r\n",fileName, representation.size,representation.url); 
[self convertVideoToLowQuailtyWithInputURL:representation.url outputURL:TempLowerQualityFileURL handler:^(AVAssetExportSession *session) 
{ 
     if (session.status == AVAssetExportSessionStatusCompleted) 
     { 
      NSLog(@"\r\n CONVERSION SUCCESS \r\n"); 
      NSString *path = [TempLowerQualityFileURL path]; 
      NSData *data = [[NSFileManager defaultManager] contentsAtPath:path]; 
      NSLog(@" \r\n POST-CONVERSION TEMP FILE %@ Size =%d ; URL=%@\r\n",fileName, data.length, path); 

      ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init]; 
      [library writeVideoAtPathToSavedPhotosAlbum:TempLowerQualityFileURL completionBlock:^(NSURL *assetURL, NSError *error) 
      { 
       if (error) 
       { 
        NSLog(@"Error Saving low quality video to Camera Roll%@", error); 
       } 

       NSLog(@"\r\n temp low quality file exists before = %d", [self fileExistsAtPath:path]); 
       [[NSFileManager defaultManager] removeItemAtURL:TempLowerQualityFileURL error:nil]; 
       NSLog(@"\r\n temp low quality file exists after = %d", [self fileExistsAtPath:path]); 

       NSURL *NewAssetUrlInCameraRoll = assetURL; 
       [[VideoThumbManager sharedInstance] replaceLink:representation.url withNewLink:NewAssetUrlInCameraRoll]; 


       }];//end writeVideoAtPathToSavedPhotosAlbum completion block. 

     } 
     else 
     { 
      // Error Handing 
      NSLog(@"\r\n CONVERSION ERROR \r\n"); 

     } 
}];//end convert completion block 
0

SWIFT 3 MP4 비디오 압축

100 %가 2MB로 URL과 함께 12메가바이트의 (문서 디렉토리) 비디오를 압축 나

를 들어이 코드를했다. .mp4 형식의 비디오를 캡처했으며 압축 된 코드는 동일한 형식의 비디오를 반환합니다. 압축이

compressVideo(inputURL: filePath , outputURL: compressedURL) { (exportSession) in 
       guard let session = exportSession else { 
        return 
       } 

       switch session.status { 
       case .unknown: 
        break 
       case .waiting: 
        break 
       case .exporting: 
        break 
       case .completed: 
        print(compressedURL) 
        let newData : Data! 
        do { 
         newData = try Data(contentsOf: compressedURL) as Data? 
         print("File size after compression: \(Double((newData?.count)!/1048576)) mb") 
        } catch { 
         return 
        } 

       case .failed: 
        print(exportSession?.error.debugDescription) 
        break 
       case .cancelled: 
        break 
       } 
      } 
를 호출

let filePath = URL(fileURLWithPath: strVideoPath) 
     var compressedURL : URL! 
     let fileManager = FileManager.default 
     do { 
      let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:true) 
      compressedURL = documentDirectory.appendingPathComponent("Video.mp4") 
     } catch { 
      print(error) 
     } 
    //It is compulsory to remove previous item at same URL. Otherwise it is unable to save file at same URL.  
     do { 
      try fileManager.removeItem(at: compressedURL) 
      print("Removed") 
     } catch { 
      print(error) 
     } 

코드 압축 비디오에 대한 대상 URL에 대한

func compressVideo(inputURL: URL, outputURL: URL, handler:@escaping (_ exportSession: AVAssetExportSession?)-> Void) { 
     let urlAsset = AVURLAsset(url: inputURL, options: nil) 
     guard let exportSession = AVAssetExportSession(asset: urlAsset, presetName: AVAssetExportPresetMediumQuality) else { 
      handler(nil) 
      return 
     } 

     exportSession.outputURL = outputURL 
     exportSession.outputFileType = AVFileTypeQuickTimeMovie // Don't change it to .mp4 format 
     exportSession.shouldOptimizeForNetworkUse = false 
     exportSession.exportAsynchronously {() -> Void in 
      handler(exportSession) 
     } 
    } 

코드 개최

기능