我有一个Cocoa直播视频程序,它使用GCDAsyncSocket作为网络接口库。播放视频帧时显然有些迟钝。例如,视频上的时间几乎是正常时间的两倍。通过检查性能,我发现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];
}
}
}
有没有人有任何想法提高从套接字读取数据的速度?谢谢!
答案 0 :(得分:0)
您使用GCDAsyncUdpSocket
了吗?我认为在你的情况下(视频传输)UDP将比TCP(GCDAsyncSocket
)表现更好。 UDP不检查数据的成功发送。所以数据不能保证交付,但好处是它会更快地执行。在视频或音频数据发送中,UDP是首选,因为一些数据丢失没有显着影响。
希望这会有所帮助:)
答案 1 :(得分:0)
它变成了parseMessage代码中的一个错误。每次阅读后我都没有正确清除缓冲区。