Monotouch AvasseTreader
-
30-10-2019 - |
Domanda
Sto cercando di convertire un campione dall'obiettivo C a Monotouch e ho incontrato alcune difficoltà.
Fondamentalmente voglio leggere un file video e decodificare i frame uno per uno a una trama OpenGL.
La chiave per farlo è usare AvasseTreader, ma non sono sicuro di come impostarlo correttamente in MonoTouch.
Questo è il mio codice:
AVUrlAsset asset=new AVUrlAsset(NSUrl.FromFilename(videoFileName),null);
assetReader=new AVAssetReader(asset,System.IntPtr.Zero);
AVAssetTrack videoTrack=asset.Tracks[0];
NSDictionary videoSettings=new NSDictionary();
NSString key = CVPixelBuffer.PixelFormatTypeKey;
NSNumber val=0x754b9d0; //NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; - Had to hardcode constant as it is not defined in Monotouch?
videoSettings.SetNativeField(key,val);
//**The program crashes here:
AVAssetReaderTrackOutput trackOutput=new AVAssetReaderTrackOutput(videoTrack,videoSettings);
assetReader.AddOutput(trackOutput);
assetReader.StartReading();
Il programma si arresta in modo anomalo sulla linea sopra indicata, con un'eccezione di argomentazione non valida, indicando che il contenuto del NSDictionary non è nel formato giusto? Ho controllato il file video e si carica bene, "Asset" contiene informazioni valide sul video.
Questo è l'obiettivo originale C codice C:
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];
AVAssetReaderTrackOutput *trackOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:videoTrack outputSettings:videoSettings];
[_assetReader addOutput:trackOutput];
[_assetReader startReading];
Non sono quello nell'obiettivo C, quindi qualsiasi aiuto è apprezzato.
Modifica: ho usato il codice suggerito di seguito
var videoSettings = NSDictionary.FromObjectAndKey (
new NSNumber ((int) MonoTouch.CoreVideo.CVPixelFormatType.CV32BGRA),
MonoTouch.CoreVideo.CVPixelBuffer.PixelFormatTypeKey);
E il programma non si blocca più. Usando il seguente codice:
CMSampleBuffer buffer=assetReader.Outputs[0].CopyNextSampleBuffer();
CVImageBuffer imageBuffer = buffer.GetImageBuffer();
Ottengo il buffer di immagini che dovrebbe contenere il frame successivo nel file video. Ispezionando l'oggetto ImageBuffer, trovo che abbia dati validi come la larghezza e l'altezza, corrispondente a quello del file video.
Tuttavia, il BaseAddress ImageBuffer è sempre 0, il che indica che l'immagine non ha dati? Ho provato a farlo come test:
CVPixelBuffer buffer=(CVPixelBuffer)imageBuffer;
CIImage image=CIImage.FromImageBuffer(buffer);
E l'immagine viene sempre restituita come null. Questo significa che i dati di immagine effettivi non sono presenti e il mio oggetto ImageBuffer contiene solo le informazioni sull'intestazione del frame?
E se è così, è un bug in Monotouch o lo sto impostando male?
Ho avuto un'idea che potrei aver bisogno di aspettare che i dati dell'immagine fossero pronti, ma in quel caso non so nemmeno come. Abbastanza bloccato ora ...
Nessuna soluzione corretta