Ios 如何使用AVAssetWriter代替AVAssetExportSession对现有视频进行重新编码

Ios 如何使用AVAssetWriter代替AVAssetExportSession对现有视频进行重新编码,ios,objective-c,ipad,video,avassetwriter,Ios,Objective C,Ipad,Video,Avassetwriter,我正试图在iPad上对视频进行重新编码,这些视频是在那个设备上录制的,但方向是“错误的”。这是因为当文件转换为MP4文件并上载到web服务器以与“视频”HTML5标记一起使用时,似乎只有Safari能够以正确的方向呈现视频 基本上,我已经通过使用AVMutableVideoCompositionLayerInstruction实现了我想要的功能,然后使用avassetextortsession创建带有音频的合成视频。但是,问题是这样做后,文件大小会大幅增加,例如更正4.1MB的原始文件会导致最终

我正试图在iPad上对视频进行重新编码,这些视频是在那个设备上录制的,但方向是“错误的”。这是因为当文件转换为MP4文件并上载到web服务器以与“视频”HTML5标记一起使用时,似乎只有Safari能够以正确的方向呈现视频

基本上,我已经通过使用
AVMutableVideoCompositionLayerInstruction
实现了我想要的功能,然后使用
avassetextortsession
创建带有音频的合成视频。但是,问题是这样做后,文件大小会大幅增加,例如更正4.1MB的原始文件会导致最终文件大小为18.5MB!我所做的就是将视频旋转180度!!顺便说一句,我试图处理的视频实例最初是由UIImagePicker在“压缩”过程中使用
videoQuality=UIImagePickerControllerQualityType640x480创建的,这实际上会在iPad mini上生成568 x 320的视频

我尝试了
AVAssetExportSession
上的各种
presetName
设置,但没有得到想要的结果。通过使用
AVAssetExportPresetMediumQuality
,我得到的文件大小最接近4.1MB(即与源代码完全相同!),但这也将合成视频的尺寸降低到480 x 272,而不是我明确设置的568 x 320

因此,这促使我研究其他选项,并因此使用
AVAssetWriter
。问题是,我找不到任何有效的
代码!我尝试了在这个SO post()上找到的代码,但无法使其工作。首先,我得到这一行的编译错误:

NSDictionary *videoOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
生成的编译错误为:

架构armv7的未定义符号:“\u kCVPixelBufferPixelFormatTypeKey”

除此之外,我尝试将AvassetraderTrackOutput的
输出设置
以nil进行传递,根据标题信息,这应该是正常的:

outputSettings的值为nil将输出配置为按指定曲目存储的原始格式出售样品。

然而,我在这条线路上遇到了一个碰撞:

NSDictionary *videoOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey];
BOOL result=[videoWriterInput appendSampleBuffer:sampleBuffer]


简而言之,我无法获得任何代码来使用
AVAssetWriter
,因此我确实需要一些帮助。有没有其他方法可以达到我想要的结果?顺便说一句,我使用的是Xcode 4.6,我使用的是ARC,目标是从iOS5到以上的所有内容。

编译错误是由于我没有包括
CoreVideo.framework
。一旦我包含并导入了它,我就可以让代码进行编译。此外,该代码可以工作并生成结果视频,但我发现了两个新问题:

  • 我无法使用
    AVAssetWriterInput
    上的
    transform
    属性使转换工作。这意味着我必须使用
    AVMutableVideoCompositionInstruction
    avassetextortsession
    进行转换
  • 如果我使用
    AVAssetWriter
    只处理压缩(因为我没有很多
    avassetxportsession
    选项),我仍然存在严重的内存泄漏。我已经尝试了我能想到的一切,从这个链接()中的解决方案开始,也从关键点的@autorelease块开始。但不管我怎么做,下面的线路似乎都会导致泄漏:

    CMSampleBufferRef sampleBuffer = [asset_reader_output copyNextSampleBuffer];
    

  • 我真的需要一些帮助。

    我已经解决了与您的问题相关的类似问题。这可能会帮助有类似问题的人:

  • 假设writerInput是AVAssetWriterInput的对象实例,assetTrack是AVAssetTrack的实例,那么您的转换问题可以通过以下方法解决:
  • writerInput.transform=assetTrack.preferredTransform

  • 在添加示例缓冲区后,您必须释放sampleBuffer,因此您会有如下结果:

    if(sampleBuffer=[asset\u reader\u output copyNextSampleBuffer]){ BOOL result=[writerInput appendSampleBuffer:sampleBuffer]; CFRelease(sampleBuffer);//释放sampleBuffer! }