Estoy grabando video en un iPhone 4 con la cámara frontal y combinando el video con otros recursos multimedia. Me gustaría que este video sea una orientación vertical: la orientación predeterminada para todos los videos es horizontal y, en algunas circunstancias, debes administrarla manualmente.Rotación de video con AVMutableVideoCompositionLayerInstruction
Estoy utilizando AVFoundation y específicamente AVAssetExportSession con una composición de video AVMutable. Basado en los videos de WWDC, está claro que tengo que encargarme de 'arreglar' la orientación cuando estoy combinando videos en una nueva composición.
Por lo tanto, he creado un AVMutableVideoCompositionLayerInstruction unido a mi AVMutableVideoCompositionInstruction y estoy usando el setTransform: atTime: método para establecer un diseño de transformación para rotar el vídeo:
AVMutableVideoCompositionLayerInstruction *passThroughLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack];
CGAffineTransform portraitRotationTransform = CGAffineTransformMakeRotation(degreesToRadians(90.0));
[passThroughLayer setTransform:portraitRotationTransform atTime:kCMTimeZero];
El problema es que cuando ver el video que se exporta, ninguno de los contenidos reales está en la pantalla. Si reduzco el ángulo de rotación a algo así como 45 grados, puedo ver parte del video en la pantalla, es casi como si no estuviera girando en el punto central. Estoy incluyendo imágenes a continuación para que quede más claro de lo que estoy hablando.
El tamaño natural del video es de 480x360. Intenté cambiar eso a 360x480 y no afecta el problema central.
0 grados de rotación:
45 grados de rotación:
Una rotación de 90 grados es sólo todo verde.
De todos modos, espero que alguien que ha hecho esto antes pueda señalarme en la dirección correcta. No puedo encontrar ningún documento sobre algunos de los temas más avanzados en las composiciones y exportaciones de AVFoundation.
La entrada AVAssetWriter tiene una propiedad de transformación que se escribe en el archivo. Supongo que esto se ignora si primero está escribiendo su video capturado en un archivo. Puede intentar transformar el centro de AVMutableVideoCompositionLayerInstruction en el origen, girándolo y luego transformándolo. Parece que el origen predeterminado es la esquina superior izquierda. Esto es interesante. Te avisaré si encuentro algo. –
@hunter ¿Puedes subir tu código para rotar el video? Por favor, ayúdame. Soy nuevo en iOS. –
@Milanpatel Hola, lamentablemente no puedo publicar este código fuente ... pero ahora hay algunos buenos recursos disponibles. Este libro es un excelente lugar para aprender todo sobre AVFoundation (http://www.amazon.com/Learning-Foundation-Hands-Mastering-Framework/dp/0321961803). En última instancia, rotar el video consiste en construir una transformada afín (utilizada en otro lugar en iOS) y, en mi caso, entender que el punto de rotación era superior izquierdo, no central. Eso significa que también tienes que moverlo. – Hunter