AVAssetExportSession que me da un borde verde en la derecha y la parte inferior del video de salida

Aquí está el código:

AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; exporter.outputURL = outputUrl; exporter.outputFileType = AVFileTypeQuickTimeMovie; exporter.videoComposition = mainComposition; exporter.shouldOptimizeForNetworkUse = YES; [exporter exportAsynchronouslyWithCompletionHandler:^{ //completion }]; 

He probado diferentes configuraciones de calidad. Siempre obtengo un borde de 1-2 píxeles corriendo por el lado derecho del video y en la parte inferior, sin importar el video que bash reproducir. ¿Qué podría estar causando esto y cómo lo soluciono?

EDIT: No estoy usando ningún tipo de color verde en ninguna parte, así que esto debe venir del marco de alguna manera.

Generalmente, las líneas verdes aparecen después del recorte de video, el problema está en el ancho de render de video, debe multiplicarse por 16.

Aquí algunos enlaces sobre esto: manzana 1 manzana 2

Resulta que si el ancho de tamaño de representación de AVMutableVideoComposition no es un número par, obtendrá los misteriosos bordes verdes. Buenos times.

Para get la resolución adecuada, intente algo como esto … incremente hasta el número más cercano que se puede dividir por 16:

 computedVideoSize=self.view.frame.size.width; while (computedVideoSize%16>0) { // find the right resolution that can be divided by 16 computedVideoSize++; } 

Esto hizo la magia para mí (iOS9, Swift 3, iPhone 6):

Basado en: https://www.raywenderlich.com/94404/play-record-merge-videos-ios-swift

Cambiar mainComposition.renderSize a:

 mainComposition.renderSize = CGSize(width: self.mainCompositionWidth, height: self.mainCompositionHeight) 

donde mainCompositionWidth , mainCompositionHeight son CGFloat s y se calculan así:

  self.mainCompositionWidth = UIScreen.mainScreen().bounds.width self.mainCompositionHeight = UIScreen.mainScreen().bounds.height while (self.mainCompositionWidth%16>0) { // find the right resolution that can be divided by 16 self.mainCompositionWidth = self.mainCompositionWidth + 1.0 } while (self.mainCompositionHeight%16>0) { // find the right resolution that can be divided by 16 self.mainCompositionHeight = self.mainCompositionHeight + 1.0 } 

También modificando scaleFitRatio en la function videoCompositionInstructionForTrack para:

 scaleToFitRatio = self.mainCompositionWidth / assetTrack.naturalSize.height 

Esto hizo desaparecer la línea verde inferior y el video llena la pantalla.

una solución mucho mejor para get el múltiplo de 16 sería este enfoque:

 floor(width / 16) * 16 

o

 ceil(width / 16) * 16 

dependiendo de su preference de tener un ancho más pequeño o más grande