2012-02-19 27 views
6

Tôi muốn, tùy thuộc vào thiết bị và cài đặt trong ứng dụng của tôi, chuyển mã video sang định dạng video cụ thể. Ví dụ: nếu người dùng có iPhone 4S và chọn cài đặt trung bình trong ứng dụng của tôi, tôi muốn chuyển đổi video thành 540p trước khi tôi bắt đầu xử lý. Nếu anh ấy chọn cao thì tôi muốn chuyển mã thành 720p.Cách tốt nhất để chuyển mã video thành mục tiêu-c (iOS) là gì?

Tôi có thể đọc khung hình video theo khung hình, thay đổi kích thước và lưu vào đĩa nhưng điều này có vẻ không hiệu quả lắm. Điều gì sẽ là cách dễ nhất và nhanh nhất để chuyển mã video mà tôi có thể chuyển sang thư viện xử lý video của mình?

Tôi đã thử sử dụng cài đặt videoQuality trên UIImagePickerController nhưng có vẻ như nó không hoạt động ngay cả khi tôi đặt nó thành UIImagePickerControllerQualityTypeIFrame960x540 video của tôi xuất hiện ở dạng 720p (640x480 nhưng tôi cần phải chi tiết hơn).

+0

Tôi chắc chắn bạn biết điều này nhưng chuyển mã mà không hỗ trợ phần cứng có thể không phải là ý tưởng hay nhất, pin khôn ngoan. –

+0

Vâng, tôi biết. Khi quay video bằng camera mặt trước, bạn có thể chuyển mã UIImagePickerController thành 560p, nó thực sự nhanh chóng. Không hoạt động đối với video được chọn từ thư viện. Tìm kiếm một cái gì đó tương tự (tức là một cuộc gọi API trực tiếp để làm tương tự cho bất kỳ video nào trong thư viện của bạn). – Michel

Trả lời

3

Bạn có thể muốn xem AVAssetExportSession, điều này làm cho việc mã hóa lại video trở nên đơn giản một cách hợp lý. Tôi nghĩ nó cũng phần cứng được hỗ trợ khi có thể giống như phần còn lại của AVFoundation:

https://developer.apple.com/library/ios/#DOCUMENTATION/AudioVideo/Conceptual/AVFoundationPG/Articles/01_UsingAssets.html

Lưu ý rằng nó sẽ không bao giờ làm cho video lớn hơn nó đã là, vì vậy bạn không được bảo đảm để có được kích thước đầu ra bạn yêu cầu. Các mã sau đây có thể là một sự khởi đầu cho những gì bạn muốn, giả sử bạn có một thể hiện của ALAsset:

- (void)transcodeLibraryVideo:(ALAsset *)libraryAsset 
     toURL:(NSURL *)fileURL 
     withQuality:(NSString *quality) { 
    // get a video asset for the original video file 
    AVAsset *asset = [AVAsset assetWithURL: 
    [NSURL URLWithString: 
     [NSString stringWithFormat:@"%@", 
     [[libraryAsset defaultRepresentation] url]]]]; 
    // see if it's possible to export at the requested quality 
    NSArray *compatiblePresets = [AVAssetExportSession 
    exportPresetsCompatibleWithAsset:asset]; 
    if ([compatiblePresets containsObject:quality]) { 
    // set up the export 
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] 
     initWithAsset:asset presetName:quality]; 
    exportSession.outputURL = fileURL; 
    exportSession.outputFileType = AVFileTypeQuickTimeMovie; 
    // run the export 
    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
     switch ([exportSession status]) { 
     case AVAssetExportSessionStatusFailed: 
      //TODO: warn of failure 
      break; 
     case AVAssetExportSessionStatusCancelled: 
      //TODO: warn of cancellation 
      break; 
     default: 
      //TODO: do whatever is next 
      break; 
     } 
     [exportSession release]; 
    }]; 
    } 
    else { 
    //TODO: warn that the requested quality is not available 
    } 
} 

Bạn muốn vượt qua một chất lượng AVAssetExportPreset960x540 cho 540p và AVAssetExportPreset1280x720 cho 720p, ví dụ.

+0

Có cách nào để đặt tốc độ khung hình trên AVAssetExportSession không. Có vẻ như tôi nhận được tỷ lệ khung hình khác nhau tùy thuộc vào cái nào tôi chọn. Nếu tôi chọn thấp tôi nhận được 15fps và cho 720p tôi nhận được 30p. Tôi muốn duy trì cảnh quay 60p của mình nhưng dường như không có bất kỳ giá trị đặt trước nào 60fps. – Michel

+0

@ user1219167: Tôi đã nghĩ bạn có thể làm điều đó với thuộc tính videoComposition của AVAssetExportSession, nhưng sau đó tôi chạy qua: http://stackoverflow.com/questions/9725193/setting-avmutablecompositions-frameduration –

+0

Xin chào, chúng tôi có thể giảm dung lượng bộ nhớ mà một video có videoQuality UIImagePickerControllerQualityTypeIFrame960x540 mất (với tỷ lệ khung hình 16: 9)? –

Các vấn đề liên quan