AVVideoComposition не работает в iOS 8

Я работаю над приложением, в котором я создаю видео и экспортирую его в каталог. Он отлично работает в iOS 7, но не работает в iOS 8.

Ниже мой код:

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.


person AltafBangash    schedule 17.09.2014    source источник
comment
Я не читал ваш код, но наше приложение выполняет композицию и отлично работает под iOS8. Я знаю, что это вам не очень поможет, но, по крайней мере, вы знаете, что 8 не виновата.   -  person Paul Cezanne    schedule 17.09.2014
comment
@PaulCezanne: вы можете опубликовать код композиции   -  person AltafBangash    schedule 18.09.2014
comment
Возможно нет. Это огромное количество кода, к тому же проприетарный. Если мне удастся извлечь безопасный фрагмент, я это сделаю. Но сейчас я в этом сомневаюсь.   -  person Paul Cezanne    schedule 18.09.2014
comment
@AltafBangash Вы запускаете этот код в симуляторе? Я получал ту же ошибку при экспорте композиции видео в симуляторе iOS 8, но, похоже, на устройстве она работает нормально.   -  person Tim    schedule 19.09.2014
comment
@ Тим Да, я бегаю на симуляторе. Хорошо, я попробую на устройстве, но сначала мне нужно установить iOS 8 на устройство. Спасибо большое, дорогой   -  person AltafBangash    schedule 19.09.2014
comment
@Tim, можешь ли ты опубликовать ссылку на видео на assetPath. Также это видео создано с помощью AVAssetWriter? Я вижу ту же проблему и считаю, что в декодере программного симулятора есть что-то, что может утверждать что-то, чего не требует аппаратный декодер.   -  person jfeldman    schedule 19.09.2014
comment
Извините, @AltafBangash, мой предыдущий комментарий был предназначен для вас   -  person jfeldman    schedule 22.09.2014
comment
Хотя я не вижу этого сообщения об ошибке, я действительно испытываю зависание при использовании композиции видео с определенными фильмами на симуляторе для Xcode 6 / iOS 8. Я написал сообщение об этом в блоге и отправил сообщение об ошибке в Apple. finalize.com/2014/10/18/ В этой статье содержится ссылка на проект на GitHub, демонстрирующий ошибку - github.com/scottcarter/VideoCompositionSimulatorBug   -  person Scott Carter    schedule 19.10.2014
comment
@ AltafBangash..Если у вас есть решение, скажите, пожалуйста, или загрузите новый код. У меня такая же проблема с этим кодом. Пожалуйста, помогите .... Спасибо.   -  person Milan patel    schedule 28.04.2015
comment
У вас есть решение этой проблемы?   -  person Nithin Michael    schedule 12.10.2015


Ответы (1)


Попробуй это :

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition
                                                                      presetName:AVAssetExportPresetPassthrough];
person Karen    schedule 25.11.2014