首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVVideoComposition在iOS 8中不起作用

AVVideoComposition在iOS 8中不起作用
EN

Stack Overflow用户
提问于 2014-09-17 20:49:02
回答 1查看 1.2K关注 0票数 5

我在应用程序上工作,在其中我正在合成视频并导出到目录。它在iOS 7中运行良好,但在iOS 8中失败。

下面是我的代码:

代码语言:javascript
复制
AVAsset *pVideoTrack = [AVAsset assetWithURL:[NSURL fileURLWithPath:assetPath]];
AVVideoComposition *origionalComposition = [AVVideoComposition videoCompositionWithPropertiesOfAsset:pVideoTrack];

AVAssetTrack *clipVideoTrack = [[pVideoTrack tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

AVMutableComposition* mixComposition = [AVMutableComposition composition];
AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo  preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, pVideoTrack.duration)
                               ofTrack:clipVideoTrack
                                atTime:kCMTimeZero error:nil];
[compositionVideoTrack setPreferredTransform:[[[pVideoTrack tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] preferredTransform]];

BOOL bIsPotrait = [self checkVideoOrientationProperty:[[pVideoTrack tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]];

CGSize videoSize = CGSizeMake(0, 0);
if(bIsPotrait)
   videoSize = CGSizeMake([[[pVideoTrack tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize].height, [[[pVideoTrack tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize].width);

else
   videoSize = [[[pVideoTrack tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] naturalSize];

AVMutableVideoComposition* videoComp = [AVMutableVideoComposition videoComposition];
videoComp.renderSize = videoSize;

AVAssetTrack *videoTrack = [[mixComposition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];

[layerInstruction setTransform:clipVideoTrack.preferredTransform atTime:kCMTimeZero];

AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction];
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mixComposition duration]);

videoComp.instructions = [NSArray arrayWithObject: instruction];

videoComp.frameDuration = origionalComposition.frameDuration;
videoComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:animatedWaterMarkLayer];

 _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality];
  _assetExport.videoComposition = videoComp;

NSString *CasheDirectory = [UICommonMethods GetLibraryCacheDirectoryPath];
NSString *outputPath = [CasheDirectory stringByAppendingPathComponent:kWatermarkVideoName];
NSURL *exportUrl = [NSURL fileURLWithPath:outputPath];

if ([[NSFileManager defaultManager] fileExistsAtPath:outputPath])
    [[NSFileManager defaultManager] removeItemAtPath:outputPath error:nil];

_assetExport.outputFileType = AVFileTypeQuickTimeMovie;
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = NO;

[_assetExport exportAsynchronouslyWithCompletionHandler:^
 {
     dispatch_async(dispatch_get_main_queue(), ^{

         switch ([_assetExport status]) {
             case AVAssetExportSessionStatusExporting:
                 NSLog(@"Export in progress ");
             case AVAssetExportSessionStatusFailed:
                 NSLog(@"Export failed (%d): %@", [[_assetExport error] code], [[_assetExport error] localizedFailureReason]);
                 [_assetExport cancelExport];
                 break;
             case AVAssetExportSessionStatusCancelled:
                 NSLog(@"Export canceled");
                 break;
             case AVAssetExportSessionStatusCompleted:
                 NSLog(@"Export done");
                 NSLog (@"finished writing %f", [dtStartDate timeIntervalSinceNow]);
                 break;
             case AVAssetExportSessionStatusWaiting:
                 NSLog (@"AVAssetExportSessionStatusWaiting");
                 break;
             case AVAssetExportSessionStatusUnknown:
                 NSLog (@"AVAssetExportSessionStatusUnknown");
                 break;
         }

     });


 }];

它显示“媒体数据无法解码,可能已损坏。”在iOS 8上运行时出错。

EN

回答 1

Stack Overflow用户

发布于 2014-11-25 14:28:56

试试这个:

代码语言:javascript
复制
AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition
                                                                      presetName:AVAssetExportPresetPassthrough];
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25891037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档