//遍历接收到的数据,并记录入 FBegins(帧头位置) FEnds(帧尾位置) 数组 //帧头$FF$D8 帧尾$FF$D9 帧头至帧尾数据合并成完整一帧 procedure TMainForm.FindAllBytes(const ABuffer: array of Byte); var i: Integer; begin SetLength(FBegins, 0); SetLength(FEnds, 0);
for i := Low(ABuffer) to High(ABuffer) -1 do begin if ABuffer[i] = $FF then begin if ABuffer[i + 1] = $D8 then begin SetLength(FBegins, Length(FBegins) + 1); FBegins[High(FBegins)] := i; end else if ABuffer[i + 1] = $D9 then begin SetLength(FEnds, Length(FEnds) + 1); FEnds[High(FEnds)] := i + 2; end; end; end; end;
//数据包帧解码 var FReceived: RtcByteArray; //array of Byte FLength, LengthBegin, LengthEnd, i: Integer; begin FReceived := ReadEx; FLength := Length(FReceived);
if (LengthBegin = 1) and (LengthEnd = 0) then begin//有帧头,无帧尾 FMS.Write(FReceived[FBegins[0]], FLength - FBegins[0]); FMS.Seek(0, soFromEnd);
FFrameStart := True; end else if (LengthBegin = 0) and (LengthEnd = 1) then begin//有帧尾,无帧头 FMS.Write(FReceived[0], FEnds[0]); Image1.Bitmap.LoadFromStream(FMS); FMS.Clear;
FFrameStart := False; end else if (LengthBegin = 0) and (LengthEnd = 0) and (FFrameStart) then begin//无帧头、无帧尾,是帧内容数据 FMS.Write(FReceived[0], FLength); FMS.Seek(0, soFromEnd);
FFrameStart := True; end else if (LengthBegin > 0) and (LengthEnd > 0) and (FBegins[0] < FEnds[0]) then begin //多帧,而且帧头小于帧尾。此情况不存在帧头数量少于帧尾数量 //先循环载入帧 for i := Low(FEnds) to High(FEnds) do begin FMS.Write(FReceived[FBegins[i]], FEnds[i] - FBegins[i]); Image1.Bitmap.LoadFromStream(FMS); FMS.Clear; end; FFrameStart := False;
//如果还多一个帧头 if LengthBegin - LengthEnd = 1 then begin FMS.Write(FReceived[FBegins[High(FBegins)]], FLength - FBegins[High(FBegins)]); FMS.Seek(0, soFromEnd);
FFrameStart := True; end; end else if (LengthBegin > 0) and (LengthEnd > 0) and (FBegins[0] > FEnds[0]) then begin //多帧,而且帧头大于帧尾。此情况不存在帧头多于帧尾数量 //先载入上一帧帧尾 FMS.Write(FReceived[0], FEnds[0]); Image1.Bitmap.LoadFromStream(FMS); FMS.Clear; FFrameStart := False;
if (LengthBegin <> LengthEnd) then//帧头数量少于帧尾数量 begin for i := Low(FBegins) to High(FBegins) do begin FMS.Write(FReceived[FBegins[i]], FEnds[i + 1] - FBegins[i]); Image1.Bitmap.LoadFromStream(FMS); FMS.Clear; end; FFrameStart := False; end else //帧头数量等于帧尾数量 begin for i := Low(FBegins) to High(FBegins) - 1 do begin FMS.Write(FReceived[FBegins[i]], FEnds[i + 1] - FBegins[i]); Image1.Bitmap.LoadFromStream(FMS); FMS.Clear; end;