【问题标题】:GCDAsyncSocket read data issueGCDAsyncSocket 读取数据问题
【发布时间】:2012-05-16 03:39:12
【问题描述】:

我有一个使用 GCDAsyncSocket 作为网络接口库的 Cocoa 直播视频程序。播放视频帧时有明显的卡顿。例如,视频上的时间几乎是正常时间的两倍。通过性能检查,发现GCDAsyncSocket的readDataToLength方法调用过于稀疏。以下是带有时间戳的日志:

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];
        }
    }
}

有没有人知道如何提高从套接字读取数据的速度?谢谢!

【问题讨论】:

    标签: cocoa gcdasyncsocket


    【解决方案1】:

    你用过GCDAsyncUdpSocket吗?我认为在您的情况下(视频传输),UDP 的性能会比 TCP(GCDAsyncSocket)更好。 UDP 不检查数据是否成功发送。所以数据不能保证被传递,但好处是它会执行得更快。在视频或音频数据发送中,UDP 是首选,因为某些数据丢失没有显着影响。

    希望这会有所帮助:)

    【讨论】:

    • 感谢 Hlung。刚刚发现我忘记更新这个问题的状态了。最后证明是我的应用程序代码中的一个错误,与 GCDAsyncSocket 无关。 Wrt UDP,我连接的 DVR 只打开了 TCP 连接,我知道制造商更喜欢 TCP 而不是 UDP,因为 TCP 的可靠性。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多