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