This question was answered in detail recently. Let me look for that thread.
25 Feb 2017 12:07 am
Here it is: Lerping an animation in code
It's framed slightly differently, but it's basically the same thing. You can a) work through AnimationState or b) work with Animation objects and the Skeleton directly. Since you need both normally-playing animations and go to a specific frame, then option A is probably best.
To rephrase from the post:
With AnimationState, when you set the animation, you set the TimeScale to 0 so the animation is paused and you can set the time yourself.
var trackEntry = skeletonAnimation.AnimationState.SetAnimation(0, "your animation", true);
trackEntry.TimeScale = 0f;
float animationTimeInSeconds = frameNumberInSpineDopesheet / 30f; // 30 means the default 30 frames per second dopesheet. Not render framerate.
trackEntry.TrackTime = animationTimeInSeconds;
Alternatively, you could also set the TimeScale on the SkeletonAnimation or AnimationState. It's up to you.
When you need the animation to resume, just set the TimeScale back to 1.