7

Ecco il codice:AVAssetExportSession dandomi un bordo verde a destra e in basso di uscita video

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

Ho provato impostazioni di qualità diverse. Ricevo sempre un bordo di 1-2 pixel che scorre lungo il lato destro del video e lungo il fondo, indipendentemente dal video che sto cercando di visualizzare. Che cosa potrebbe causare questo e come lo risolvo?

MODIFICA: Non sto usando alcun tipo di colore verde da nessuna parte, quindi questo deve provenire dal framework in qualche modo.

risposta

10

linee di solito verde compaiono dopo il ritaglio video, il problema è in video la larghezza RenderSize, dovrebbe essere moltiplicano di 16.

Ecco alcuni link su questo: apple 1 apple 2

2

Si scopre che se la larghezza della dimensione di rendering di AVMutableVideoComposition non è un numero pari, si ottengono i misteriosi bordi verdi. Bei tempi.

2

Al fine di ottenere il corretto risoluzione provare qualcosa di simile ... incrementa fino a quando il numero più vicino che può essere diviso per 16:

computedVideoSize=self.view.frame.size.width; 

while (computedVideoSize%16>0) { // find the right resolution that can be divided by 16 
    computedVideoSize++; 
} 
2

questo ha fatto la magia per me (iOS9, Swift 3, iPhone 6):

Sulla base: https://www.raywenderlich.com/94404/play-record-merge-videos-ios-swift

Modifica mainComposition.renderSize a:

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

dove mainCompositionWidth, mainCompositionHeight sono CGFloat s e sono calcolate come questo :

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 
    } 

modificando anche scaleFitRatio nella funzione videoCompositionInstructionForTrack a:

scaleToFitRatio = self.mainCompositionWidth/assetTrack.naturalSize.height 

Questo ha reso la linea verde inferiore scompare e il video riempie lo schermo.

4

una soluzione molto più bello per ottenere il multiplo di 16 sarebbe questo approccio:

floor(width/16) * 16 

o

ceil(width/16) * 16 

a seconda delle preferenze di avere una più piccola o più grande larghezza

+0

Grazie! Questo ha fatto il trucco per me (semplice e facile). – smartbot