以下是为了了解自己这段时间的学习情况,而进行的总结, 目的是为了完成从某服务器得到数据,在iOS设备上进行解析,并完成实时播放的目的。
其中,使用到 ffmpeg, GCDAsyncSocket, wireShark工具
1. 首先需要实现在本地播放视频文件,这里指的是h264格式的视频格式。需要采用到ffmpeg来进行解析播放,具体如何配置ffmpeg,我在前面的文章中已经提到。
2. 通过GCDAsyncSocket来连接服务器,并通过wireShark来查看其中传递的命令是否正确。
遇到两个问题:
a. 心跳的问题,
在用GCDAsyncSocket与服务器连接时,通常对于用Socket方式的服务器,由于Socket的连接会比较耗资源,所以服务器一般都会要求客户端在一定时期内进行心跳检测,以让服务器知道客户端已经断开连接,从而回收这个Socket资源,以供其它Socket使用。而这个心跳命令,是每个服务器都会自己定义自己的心跳格式。我遇到这个问题的征状是,建立完成GCDAsyncSocket连接后,约2分钟, GCDAsyncSocket的delegate会收到方法,
说是,连接被远端断开,
“failed because Error
Domain=GCDAsyncSocketErrorDomain Code=7 "Socket closed by remote peer"
UserInfo=0x7f85d8d1dd50 {NSLocalizedDescription=Socket closed by
remote peer} ”
方法“- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err”被调用,这个可以说明其实就是因为心跳没有连接好,以致于服务器认为客户端已经断开了连接,
认识到这个原因后,通过wireShark来分析正常的客户端应该发送什么样的数据,然后再看看自己的客户端发送的什么数据,比对后,很容易找到问题,拼出服务器期望的数据后,心跳的这个问题
b. 在连接的过程上,
if (![_controlSocketconnectToHost:SOCKET_HOSTonPort:SOCKET_CONTROL_PORTerror:&control_error])
ocketDidDisconnect:0x834d5d0 withError: Error Domain=NSPOSIXErrorDomain Code=61 "Connection refused" UserInfo=0x6c3f5c0 {NSLocalizedFailureReason=Error in connect() function, NSLocalizedDescription=Connection refused}
2012-03-20 14:46:21.795 CameraSeek[945:f803] socket Disconnected
结果又纠结了半天, 后来才发现,因为我回家里进行了调试,改动了 SOCKET_HOST 这个IP值,以致于在建立这个Socket时,出错。 真是个呆子啊