Hallo
DP,
Ich habe eine Delphi-Anwendung, die mithilfe des TVideograbbers (Datastead) ein Video abspielt. Diese Anwendung steuere ich mithilfe einer iPhone-App. Dazu habe ich ein Datenmodul mit einem IdHttpServer hinzugefügt und folgenden OnCommandGet-EventHandler:
Delphi-Quellcode:
procedure TdmNetwork.httpServerCommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
jo : IJSONObject;
ctx : TRttiContext;
typ : TRttiType;
m : TRttiMethod;
param : TValue;
begin
jo := TJSON.NewObject(ARequestInfo.Params.Values['p']);
param := TValue.From<IJSONObject>(jo);
ctx := TRttiContext.Create;
try
typ := ctx.GetType(TMyVideoPlayer);
m := typ.GetMethod(jo.GetString('Command'));
AResponseInfo.ContentText := m.Invoke(fVideoPlayer,[param]).AsString;
finally
ctx.Free;
end;
end;
In der App schicke ich dann z.B. so einen Request:
Code:
- (void) play
{
NSURL *
url = [NSURL URLWithString:@"http://
ip.vom.rechner/?p={"Command":"Play"}"];
NSString *response = [NSString stringWithContentsOfURL:
url];
}
funktionert soweit prima.
Allerdings wollte ich jetzt eine Trackbar zur Fortschrittsanzeige in der App haben. Dazu habe ich in der App einen Thread erstellt, der mir alle 900ms die aktuelle Position abfragt und dann entsprechend die Value von einem UISlider (iOS-Äquivalent zu TTrackBar) setzt. Ist nicht die schönste Lösung, da hier gepollt wird, aber so komme ich um die Programmierung eines Servers in Objective-C herum.
Allerdings habe ich jetzt Ruckler im Video (kaum sichtbar im Bild, aber deutlich hörbare Audioruckler).
hier noch die Implementierung von GetPosition:
Delphi-Quellcode:
function TMyVideoPlayer.GetPosition(jo: IJSONObject): string;
var
joResult : IJSONObject;
begin
joResult := TJSON.NewObject;
joResult.Put('Position',fVideoForm.getPosition);
result := joResult.ToString;
end;
Der IdHttpServer macht für jede anfrage einen neuen Thread auf, in dem dann OnCommandGet ausgeführt wird, warum kommt es dann zu den rucklern?
PS: Ich weiß, dass das DataSnap für Arme ist, aber ich hab leider nur die Prof. und nicht die Enterprise