用Objective-C(iOS)转码视频的最佳方法是什么?

6
根据设备和应用程序设置,我希望能将视频转码为特定的视频格式。例如,如果用户有iPhone 4S并在我的应用程序中选择中等设置,则我希望在开始处理之前将视频转换为540p。如果他选择高级,则我希望转码为720p。
我可以逐帧读取视频,调整大小并保存到磁盘,但这似乎不太有效。有什么最简单,最快速的方法可以转码视频,以便我可以提供给我的视频处理库?
我尝试使用UIImagePickerController上的videoQuality设置,但似乎不起作用,即使我将其设置为UIImagePickerControllerQualityTypeIFrame960x540,我的视频也会以720p输出(640x480可行,但我需要更精细的)。

我相信你知道这一点,但是如果没有硬件支持进行转码可能不是最好的选择,从电池寿命的角度来看。 - Joachim Isaksson
是的,我知道。使用前置摄像头录制视频时,您可以让UIImagePickerController转码为560p,它非常快速。但对于从库中选择的视频则不起作用。正在寻找类似的东西(即直接API调用以对库中的任何视频执行相同操作)。 - Michel
1个回答

3

您可能需要查看AVAssetExportSession,它使重新编码视频变得相当简单。我认为它在可能的情况下也像AVFoundation的其他部分一样受到硬件支持:

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

请注意,它永远不会使视频比原来更大,因此无法保证您得到所请求的输出大小。假设您有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
  }
}

你需要传递AVAssetExportPreset960x540以获得540p的质量,传递AVAssetExportPreset1280x720以获得720p的质量,例如。

有没有一种方法可以在AVAssetExportSession中设置帧速率?似乎我选择的不同选项会得到不同的帧速率。如果我选择低,则获得15fps,而对于720p,我获得30p。我想保持我的60p镜头,但似乎没有任何预设可以使用60fps。 - Michel
@user1219167: 我在想你可能可以通过AVAssetExportSession的videoComposition属性来实现,但是后来我看到了这个链接:https://dev59.com/o2HVa4cB1Zd3GeqPoJWq - Jesse Crossen
你好,我们能否减少使用16:9宽高比的UIImagePickerControllerQualityTypeIFrame960x540视频所占用的内存空间? - iOS Monster
这对于不是在iPhone上拍摄且不是HVEC格式的视频有效吗?https://developer.apple.com/documentation/avfoundation/media_assets_and_metadata/exporting_video_to_alternative_formats - 提到输入应为:let anAsset = //您的源AVAsset电影以HEVC格式// - voidsstr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接