SDK за iPhone. възможно ли е да завъртате видеоклипове в AVplayer с помощта на AVURLlAsset / AVMutableComposition?

Имам прост изглед за редактиране на видео, който използва AVPlayer. Създавам AVMutableComposition, използвайки един или няколко AVURLAsset. Всичко работи добре, но видеоклиповете винаги се завъртат на 90 градуса. ако изходното видео е заснето в портретен режим. AVPlayer го показва в пейзажен режим и обратно. Прегледах документацията и я „гуглих“ до смърт и не мога да намеря решение. Може би търся на грешните места.

Може ли някой да помогне?

Благодаря предварително;

Жан-Пиер


person Jean-Pierre Semery    schedule 01.03.2011    source източник
comment
След като гледах сесия на WWDC10 на AVFoundation, вярвам, че има настройка някъде, но трябва да я гледам отново. Ще публикувам отговора, когато съм сигурен   -  person Jean-Pierre Semery    schedule 06.03.2011
comment
Решавали ли сте някога този проблем? Имам същия проблем.   -  person Jeremie Weldin    schedule 02.02.2012
comment
Решихте ли този проблем? Имам същия проблем и не знам какво да правя   -  person Gaby Fitcal    schedule 18.08.2015


Отговори (2)


доколкото разбрах, имате някои проблеми с ориентацията, като портретното видео е в пейзажен режим и понякога видеоклиповете са обърнати с главата надолу. Това се дължи на ориентацията на AVAsset по подразбиране. Всички файлове с филми и изображения, записани с помощта на приложението за камера по подразбиране на iPhone, имат видео рамка, настроена на пейзаж, и така мултимедията се записва в пейзажен режим. AVAsset има свойството preferredTransform, което съдържа информацията за ориентацията на медиите и това се прилага към медиен файл всеки път, когато го преглеждате с помощта на приложението Photos или QuickTime. Можете лесно да коригирате това, като приложите необходимите трансформации към вашите AVAsset обекти. Но тъй като вашите два видеофайла могат да имат различни ориентации, ще трябва да използвате два отделни екземпляра на AVMutableCompositionTrack вместо един (предполагаме), както направихте първоначално. Създайте две видео записи на AVMutableCompositionTrack Тъй като вече имате два отделни екземпляра на AVMutableCompositionTrack, трябва да приложите AVMutableVideoCompositionLayerInstruction към всяка песен, за да коригирате ориентацията. Така че добавете следния код

    //  Create AVMutableVideoCompositionInstruction
AVMutableVideoCompositionInstruction *mainInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];
mainInstruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeAdd(firstAsset.duration, secondAsset.duration));
// Create an AVMutableVideoCompositionLayerInstruction for the first track
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;
}
[firstlayerInstruction setTransform:firstAsset.preferredTransform atTime:kCMTimeZero];
[firstlayerInstruction setOpacity:0.0 atTime:firstAsset.duration];
//  Create an AVMutableVideoCompositionLayerInstruction for the second track
AVMutableVideoCompositionLayerInstruction *secondlayerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:secondTrack];
AVAssetTrack *secondAssetTrack = [[secondAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
UIImageOrientation secondAssetOrientation_  = UIImageOrientationUp;
BOOL isSecondAssetPortrait_  = NO;
CGAffineTransform secondTransform = secondAssetTrack.preferredTransform;
if (secondTransform.a == 0 && secondTransform.b == 1.0 && secondTransform.c == -1.0 && secondTransform.d == 0) {
    secondAssetOrientation_= UIImageOrientationRight; 
    isSecondAssetPortrait_ = YES;
}
if (secondTransform.a == 0 && secondTransform.b == -1.0 && secondTransform.c == 1.0 && secondTransform.d == 0) {
    secondAssetOrientation_ =  UIImageOrientationLeft; 
    isSecondAssetPortrait_ = YES;
}
if (secondTransform.a == 1.0 && secondTransform.b == 0 && secondTransform.c == 0 && secondTransform.d == 1.0) {
    secondAssetOrientation_ =  UIImageOrientationUp;
}
if (secondTransform.a == -1.0 && secondTransform.b == 0 && secondTransform.c == 0 && secondTransform.d == -1.0) {
    secondAssetOrientation_ = UIImageOrientationDown;
}
[secondlayerInstruction setTransform:secondAsset.preferredTransform atTime:firstAsset.duration];
}

накрая добавете инструкции, това е само корекцията на ориентацията, приложена към втората песен.

    mainInstruction.layerInstructions = [NSArray arrayWithObjects:firstlayerInstruction, secondlayerInstruction,nil];
AVMutableVideoComposition *mainCompositionInst = [AVMutableVideoComposition videoComposition];
mainCompositionInst.instructions = [NSArray arrayWithObject:mainInstruction];
mainCompositionInst.frameDuration = CMTimeMake(1, 30);

CGSize naturalSizeFirst, naturalSizeSecond;
if(isFirstAssetPortrait_){
    naturalSizeFirst = CGSizeMake(FirstAssetTrack.naturalSize.height, FirstAssetTrack.naturalSize.width);
} else {
    naturalSizeFirst = FirstAssetTrack.naturalSize;
}
if(isSecondAssetPortrait_){
    naturalSizeSecond = CGSizeMake(SecondAssetTrack.naturalSize.height, SecondAssetTrack.naturalSize.width);
} else {
    naturalSizeSecond = SecondAssetTrack.naturalSize;
}

float renderWidth, renderHeight;
if(naturalSizeFirst.width > naturalSizeSecond.width) {
    renderWidth = naturalSizeFirst.width;
} else {
    renderWidth = naturalSizeSecond.width;
}
if(naturalSizeFirst.height > naturalSizeSecond.height) {
    renderHeight = naturalSizeFirst.height;
} else {
    renderHeight = naturalSizeSecond.height;
}
MainCompositionInst.renderSize = CGSizeMake(renderWidth, renderHeight);

Надявам се това да помогне

person Abhinav Singh    schedule 15.05.2013

Без да разполагате с кода за проверка, е трудно да разберете какво се случва... Но най-вероятно проблемът ви е причинен, защото губите стойността на своето свойство preferredTransform.

Всички AVAssetTrack обекти имат свойство preferredTransform, което се използва за указване дали видеоклиповете трябва да се завъртат или не. Ако създавате нови AVMutableAssetTrack обекти, може да се наложи да зададете стойността на това свойство, така че видеото да остане в предвидената ориентация.

person flainez    schedule 08.10.2012