As you mention setPreviewFpsRange()in your question, I assume that you can use preview permission. In this case, you can slightly change the frame rate by encoding the video yourself. Basically, run it at “normal” speed and capture frames when they enter PreviewCallback. Check the time since the last frame, discard the ones you do not need. Then, when you're done, use something like FFMPEG to encode the video.
This does not guarantee an absolutely constant speed, but you should be able to control it more consistently on different devices, since different devices handle automatic speed changes in a completely different way.
, , , , . , , , .