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という変数が何らかの形で失われているようです。
質問のカップル:
はCMSampleBufferRefへのNSDataを開梱について移動する正しい方法をdata.bytesをキャストされていますか?
受信するデータが実際にはCMSampleBufferオブジェクトであることをどのようにアサートしますか?コードを保護したいのですが、Core Foundationクラスのクラス検証をどのように達成するのかはわかりません。
ありがとうございます!
正直なところ私はたくさんのCが分かっていないので、コードをコピーしてmalloc_sizeなどのものを推測するこの作業をするために何ができるかを試しました。 CMSampleBufferのサイズを確認する信頼できる方法はありますか? – Arman