2010-12-05 10 views
1

GameKitで作成したピアツーピア接続でビデオデータをストリーミングしようとしています。私はNSDataオブジェクトを受け取り、CALayerの上にビデオストリームを描画するためにそれを使用する方法があります:GameKitのNSDataとEXC_BAD_ACCESSの奇妙な問題

:ここ

- (void)recieveVideoFromData:(NSData *)data; 

はCMSampleBufferRefsにNSDataのを変換して処理を開始し、そのメソッドの最初の数行です

CMSampleBufferRef imgData = (CMSampleBufferRef)data.bytes; 
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(imgData); 
CVPixelBufferLockBaseAddress(imageBuffer,0); 

さて、次のように私はこの方法にローカルカメラからのビデオストリームを供給するとき、すべてがうまくて、画面上のビデオストリームが表示され動作します。

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 
    NSData *data = [[NSData alloc] initWithBytes:sampleBuffer length:malloc_size(sampleBuffer)]; 
    [self recieveVideoFromData:data]; 
} 

しかし、私は、ピア・ツー・ピア接続を介してこれらのNSDataのパケットのストリームを送信し、次の方法でそれらを受け取るとき、私はEXC_BAD_ACCESSエラーを取得:

デバッガを使用して
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID { 
    [self recieveVideoFromData:data]; 
} 

、私は悪いことを学びましたアクセスは、この行で発生します

CVPixelBufferLockBaseAddress(imageBuffer,0); 

私はNSDataのは、同じデバイス上の別の方法から送られたNSDataより任意の異なる必要があり、ネットワークを介して送信される理由はわかりません。ネットワークを介して受信したデータが同じ間隔で受信され、ローカルデバイスで生成されたデータと同じ長さ(336バイト)であることを確認しました。私はまた、データオブジェクトの保持カウントが使用前に1であることを確認しました。 imageBufferという変数が何らかの形で失われているようです。

質問のカップル:

  1. CMSampleBufferRefへのNSDataを開梱について移動する正しい方法をdata.bytesをキャストされていますか?

  2. 受信するデータが実際にはCMSampleBufferオブジェクトであることをどのようにアサートしますか?コードを保護したいのですが、Core Foundationクラスのクラス検証をどのように達成するのかはわかりません。

ありがとうございます!

答えて

0

これはおそらく完全な回答ではありませんが、malloc_sizeの使用は私にとって大きな赤旗のようです。これは、ANSI、ISOまたはPOSIXのようなものではなく、ポータブルではない拡張機能のようです。mallocから来ていないバッファを渡すと、どのように動作するか疑問があります。それは、頼りにするようなスケッチなもののように思えます。 (私はそれがmalloc_sizeを呼び出すようになったとしたら、Cはバッファが先行していることを知っていて、 )

+0

正直なところ私はたくさんのCが分かっていないので、コードをコピーしてmalloc_sizeなどのものを推測するこの作業をするために何ができるかを試しました。 CMSampleBufferのサイズを確認する信頼できる方法はありますか? – Arman

1

NSDataのバイトをキャストして、CMSampleBufferを開梱しているのはなぜですか(開梱していません)? CMSampleBufferはメモリ内の連続ブロックではないので、これはうまくいかないでしょう。

あなたはあなたを与える可能性がある。この機能でデータ型をオブジェクトにしてNSData、それをものを送信する前にCMSampleBuffer自分からすべての関連データを取得し、

OSStatus CMSampleBufferCreate (
    CFAllocatorRef allocator, 
    CMBlockBufferRef dataBuffer, 
    Boolean dataReady, 
    CMSampleBufferMakeDataReadyCallback makeDataReadyCallback, 
    void *makeDataReadyRefcon, 
    CMFormatDescriptionRef formatDescription, 
    CMItemCount numSamples, 
    CMItemCount numSampleTimingEntries, 
    const CMSampleTimingInfo *sampleTimingArray, 
    CMItemCount numSampleSizeEntries, 
    const size_t *sampleSizeArray, 
    CMSampleBufferRef *sBufOut 
); 

を介して、他の側にそれをreasembleする必要がありますあなたのデータを梱包するときにCMSampleBufferから抽出したいものを示唆します。

+0

サンプルやチュートリアルを提供することはできますか?ありがとう –