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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top