Как исправить проблему с ориентацией видео в iOS

Я работаю с приложением, в котором пользователь выбирает видео из фотографий и загружает его на сервер. Поскольку мой сервер является сервером .Net, видео вращается. Я знаю, что причина проблемы, вероятно, такая же, как и в случае с изображением (вы можете сослаться на мой предыдущий ответ https://stackoverflow.com/a/10601175/1030951), поэтому я погуглил и получил код для исправления ориентации видео, я получил код с RayWenderlich.com и изменил его следующим образом. Теперь мое выходное видео работает нормально, но видео не работает. он играет, но не воспроизводит звук. Пожалуйста, помогите мне, если я что-то упустил.

Я передаю Информационный словарь метода -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

- (void)fix:(NSDictionary*)pobjInfoDirectory withFileName:(NSString*)pstrOutputFileName
{
    firstAsset = [AVAsset assetWithURL:[pobjInfoDirectory objectForKey:UIImagePickerControllerMediaURL]];


    if(firstAsset !=nil)
    {
        //Create AVMutableComposition Object.This object will hold our multiple AVMutableCompositionTrack.
        AVMutableComposition* mixComposition = [[AVMutableComposition alloc] init];

        //VIDEO TRACK
        AVMutableCompositionTrack *firstTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
        [firstTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];

        AVMutableVideoCompositionInstruction * MainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];

                MainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, firstAsset.duration);

        //FIXING ORIENTATION//
        AVMutableVideoCompositionLayerInstruction *FirstlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack];

        AVAssetTrack *FirstAssetTrack = [[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

        UIImageOrientation FirstAssetOrientation_  = UIImageOrientationUp;

        BOOL  isFirstAssetPortrait_  = NO;

        CGAffineTransform firstTransform = FirstAssetTrack.preferredTransform;

        if(firstTransform.a == 0 && firstTransform.b == 1.0 && firstTransform.c == -1.0 && firstTransform.d == 0)
        {
            FirstAssetOrientation_= UIImageOrientationRight; isFirstAssetPortrait_ = YES;
        }        
        if(firstTransform.a == 0 && firstTransform.b == -1.0 && firstTransform.c == 1.0 && firstTransform.d == 0)
        {
            FirstAssetOrientation_ =  UIImageOrientationLeft; isFirstAssetPortrait_ = YES;
        }
        if(firstTransform.a == 1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == 1.0)
        {
            FirstAssetOrientation_ =  UIImageOrientationUp;
        }
        if(firstTransform.a == -1.0 && firstTransform.b == 0 && firstTransform.c == 0 && firstTransform.d == -1.0)
        {
            FirstAssetOrientation_ = UIImageOrientationDown;
        }

        CGFloat FirstAssetScaleToFitRatio = 320.0/FirstAssetTrack.naturalSize.width;

        if(isFirstAssetPortrait_)
        {
            FirstAssetScaleToFitRatio = 320.0/FirstAssetTrack.naturalSize.height;
            CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio);
            [FirstlayerInstruction setTransform:CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor) atTime:kCMTimeZero];
        }
        else
        {
            CGAffineTransform FirstAssetScaleFactor = CGAffineTransformMakeScale(FirstAssetScaleToFitRatio,FirstAssetScaleToFitRatio);
            [FirstlayerInstruction setTransform:CGAffineTransformConcat(CGAffineTransformConcat(FirstAssetTrack.preferredTransform, FirstAssetScaleFactor),CGAffineTransformMakeTranslation(0, 160)) atTime:kCMTimeZero];
        }
        [FirstlayerInstruction setOpacity:0.0 atTime:firstAsset.duration];

        MainInstruction.layerInstructions = [NSArray arrayWithObjects:FirstlayerInstruction,nil];;

        AVMutableVideoComposition *MainCompositionInst = [AVMutableVideoComposition videoComposition];
        MainCompositionInst.instructions = [NSArray arrayWithObject:MainInstruction];
        MainCompositionInst.frameDuration = CMTimeMake(1, 30);
        MainCompositionInst.renderSize = CGSizeMake(320.0, 480.0);

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *myPathDocs =  [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"mergeVideo-%d.mov",arc4random() % 1000]];

        NSURL *url = [NSURL fileURLWithPath:myPathDocs];

        AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];

        exporter.outputURL=url;
        exporter.outputFileType = AVFileTypeQuickTimeMovie;
        exporter.videoComposition = MainCompositionInst;
        exporter.shouldOptimizeForNetworkUse = YES;
        [exporter exportAsynchronouslyWithCompletionHandler:^
         {
             dispatch_async(dispatch_get_main_queue(), ^{
                 [self exportDidFinish:exporter];
             });
         }];
    }
}

- (void)exportDidFinish:(AVAssetExportSession*)session
{
    if(session.status == AVAssetExportSessionStatusCompleted)
    {
        NSURL *outputURL = session.outputURL;
        ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

        if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputURL])
        {
            if ([self.delegate respondsToSelector:@selector(videoExported)])
                [self.delegate videoExported];    
        }
    }       
    firstAsset = nil;
}

person HarshIT    schedule 20.04.2013    source источник
comment
Вы уверены, что это не ваш iPhone отключен?   -  person Rui Peres    schedule 20.04.2013
comment
да, я играл в приложение для фотографий, оно играло со звуком..   -  person HarshIT    schedule 20.04.2013
comment
проверьте, что это может помочь вам stackoverflow. ком/вопросы/2814626/   -  person Nitin Gohel    schedule 20.04.2013
comment
@NitinGohel, спасибо, но он просто определяет ориентацию видео, я сделал то же самое в другом, если лестница. Моя проблема в том, что звук не воспроизводится. воспроизводится только звук   -  person HarshIT    schedule 20.04.2013
comment
проверьте это сообщение, это вам нужно, скажите, как сделать перекодирование видео /28056569#28056569" title="как исправить ориентацию видео в объективе c"> stackoverflow.com/questions/20402106/   -  person GOrozco58    schedule 21.01.2015
comment
@HarshIT, я хочу объединить портретное и альбомное видео, но не могу понять. можно в группу пожалуйста.   -  person Vatsal Shukla    schedule 06.04.2016
comment
@Vats, извините из-за плотного графика, я не смог ответить вам вовремя. Я полагаю, что для объединения видео с такими разными ориентациями вам может потребоваться изменить размер видеокадра.   -  person HarshIT    schedule 06.04.2016


Ответы (2)


Добавьте это после части //VIDEO TRACK

        //AUDIO TRACK
        AVMutableCompositionTrack *firstAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
        [firstAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, firstAsset.duration) ofTrack:[[firstAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];
person Or Arbel    schedule 20.04.2013
comment
для видео тоже будет работать? я имею в виду, что столкнулся с проблемой ориентации объединенных видео после применения преобразования. Любая помощь приветствуется. - person Abdul Yasin; 09.01.2015
comment
@AbdulYasin, вы нашли решение проблемы ориентации после слияния??? если да, можете ли вы дать мне предложение - person Nilesh; 19.11.2015

AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:@"your video url here..." options:nil];

Добавить после AVMutableCompositionTrack.

set setPreferredTransform: установите здесь исходное видео, которое вы хотите экспортировать с той же ориентацией.

 // Grab the source track from AVURLAsset for example.
AVAssetTrack *assetVideoTrack = [videoAsset tracksWithMediaType:AVMediaTypeVideo].lastObject;

// Grab the composition video track from AVMutableComposition you already made.
AVMutableCompositionTrack *compositionVideoTrack = [mixComposition tracksWithMediaType:AVMediaTypeVideo].lastObject;

// Apply the original transform.
if (assetVideoTrack && compositionVideoTrack) {
        [compositionVideoTrack setPreferredTransform:assetVideoTrack.preferredTransform];
    }
person kuldip bhalodiya    schedule 10.04.2017