2012-01-19 2 views
1

목표 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의 버그입니까, 아니면 이것을 잘못 설정하고 있습니까?

나는 이미지 데이터가 준비 될 때까지 기다릴 필요가 있을지 모른다는 생각이 들었지 만,이 경우에도 나는 어느 쪽인지 모른다. 이제 막 붙어 ...

답변

3

는이 같이있는 NSDictionary를 만들어야합니다

var videoSettings = NSDictionary.FromObjectAndKey (
    new NSNumber ((int) MonoTouch.CoreVideo.CVPixelFormatType.CV32BGRA), 
    MonoTouch.CoreVideo.CVPixelBuffer.PixelFormatTypeKey); 

SetNativeField 완전히 다른 무언가 (당신이 사전에 키/값 쌍을 추가 0x754b9d0-CVPixelBuffer.PixelFormatTypeKey라는 이름의 필드를하지 설정하는)입니다.

1

[NSNumber numberWithUnsignedInt : kCVPixelFormatType_32BGRA]; Monotouch에 정의되어 있지 않으므로 상수를 하드 코드해야합니까?

이가 교체 할 수 있어야한다 : MonoTouch는 당신과 다른 0x42475241로이 값을 정의하는

CVPixelFormatType.CV32BGRA 

참고. 그건 네 잘못이야. 그렇지 않다면 작고 ​​독립적 인 테스트 케이스를 작성하여 http://bugzilla.xamarin.com의 버그 보고서에 첨부하면됩니다.

가능한 경우 objective-c 샘플에 대한 링크가 도움이 될 것입니다 (여기에 대한 질문 또는 버그 보고서 업데이트).