목표 C에서 Monotouch로 샘플을 변환하려고하는데 몇 가지 어려움이 있습니다.Monotouch AVAssetReader
기본적으로 비디오 파일을 읽고 프레임을 하나씩 OpenGL 텍스처로 디코드하고 싶습니다.
이 작업을 수행하는 열쇠는 AVAssetReader를 사용하는 것이지만 Monotouch에서이를 올바르게 설정하는 방법을 모르겠습니다.
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();
라인의 프로그램이 충돌이있는 NSDictionary의 내용이 올바른 형식이 아닌 것을 나타내는, 잘못된 인수를 제외하고, 위의 표시 :
이 내 코드? 비디오 파일을 확인한 후 잘로드됩니다. "자산"에는 비디오에 대한 유효한 정보가 들어 있습니다.
이 원래 목적 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];
내가 그 아니에요 목적 C에, 그래서 어떤 도움에 감사드립니다.
편집 : 나는 코드가
var videoSettings = NSDictionary.FromObjectAndKey (
new NSNumber ((int) MonoTouch.CoreVideo.CVPixelFormatType.CV32BGRA),
MonoTouch.CoreVideo.CVPixelBuffer.PixelFormatTypeKey);
아래에 제시되지 그리고 프로그램이 더 이상 충돌 사용. 다음 코드를 사용하여 :
CMSampleBuffer buffer=assetReader.Outputs[0].CopyNextSampleBuffer();
CVImageBuffer imageBuffer = buffer.GetImageBuffer();
나는 비디오 파일에 다음 프레임을 포함해야하는 이미지 버퍼를 얻습니다. imageBuffer 객체를 검사하여 비디오 파일의 폭과 높이와 일치하는 유효한 데이터를 찾았습니다.
그러나 imageBuffer BaseAddress는 항상 0이며 이미지에 데이터가 없음을 나타냅니다. 나는 이것을 시험으로 시도했다 :
CVPixelBuffer buffer=(CVPixelBuffer)imageBuffer;
CIImage image=CIImage.FromImageBuffer(buffer);
그리고 항상 null로 이미지가 반환된다. 이것은 실제 이미지 데이터가 존재하지 않고, imageBuffer 객체가 프레임 헤더 정보 만 포함한다는 것을 의미합니까?
만약 그렇다면 Monotouch의 버그입니까, 아니면 이것을 잘못 설정하고 있습니까?
나는 이미지 데이터가 준비 될 때까지 기다릴 필요가 있을지 모른다는 생각이 들었지 만,이 경우에도 나는 어느 쪽인지 모른다. 이제 막 붙어 ...