2012-05-16 57 views
0

我有一个使用GCDAsyncSocket作为网络接口库的Cocoa实时视频程序。播放视频帧时有明显的缓慢。例如,视频上的时间几乎是正常情况下的两倍。通过检查性能,我发现GCDAsyncSocket的readDataToLength方法调用得太稀少。下面是日志,时间戳:GCDAsyncSocket读取数据问题

2012-05-16 11:18:27.054 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.256 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.285 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.452 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.475 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.697 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.726 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.856 DVRLibDemo[1181:903] readDataToLength 

我创建套接字时设置了单独的委托调度队列,但它并没有太大的帮助。消息有一个固定的头,我首先读取头,然后读取有效载荷。

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{  
    DVRConnection *conn = [self getConnectionWithSocket:sock]; 

    //DebugLogInfo(@"Receive raw data: %@ for connection: %d", data, conn.tag); 

    if (conn != nil && conn.connected) 
    { 
     if (tag == TAG_XM_MESSAGE_HEADER) 
     { 
      uint32_t bodyLen = [_parser parseMessageHeader:data]; 
      [sock readDataToLength:bodyLen withTimeout:-1 tag:TAG_XM_MESSAGE_PAYLOAD]; 
     } 
     else if (tag == TAG_XM_MESSAGE_PAYLOAD) 
     { 
      [_parser parseMessage:data forConnection:conn device:self]; 
      [sock readDataToLength:XM_MESSAGE_HEADER_LENGTH withTimeout:-1 tag:TAG_XM_MESSAGE_HEADER]; 
     } 
    } 
} 

没有人有任何想法,以提高从套接字读取数据的速度?谢谢!

回答

0

它变成了一个在parseMessage代码中的错误。每次读取后我都没有正确清除缓冲区。

0

你使用GCDAsyncUdpSocket?我认为UDP会比TCP(GCDAsyncSocket)在你的情况下更好(视频传输)。 UDP不检查是否成功发送数据。所以数据不能保证交付,但是它的表现会更快。在视频或音频数据发送中,UDP是首选,因为有些数据丢失没有显着影响。

希望这有助于:)

+0

感谢Hlung。刚发现我忘了更新这个问题的状态。最后它变成了我的应用程序代码中的一个错误,与GCDAsyncSocket无关。 Wrt UDP,我连接的DVR只打开了TCP连接,我明白制造商更喜欢TCP到UDP,因为TCP的可靠性。 – cs2k