简体   繁体   中英

How to play FLV video at “incoming frames speed” (not video-internal) coming from NetStream in ActionScript

How to play NetStream frames immediatly as they arrive without any additional AS framerate logic?

I have recorded some audio & video data packets from RTMP protocol received by Red5, and now I'm trying to send it back to the flash client in a loop by pushing packets to NetStream with incrementing timestamp. The looped sequence has length of about ~20 sec nad is build from about ~200 RTMP packets (VideoData/AudioData)

Environment: both Flash client and server on localhost, no network bottleneck, video is H.264 encoded earlier by same Flash client.

It generaly works, but video is not very fluent - there ale lot of freezes, slowdowns and long pauses. The slower packets transmitting causing the more pauses and freezes. , even extreme long pauses like transmiting whole sequence 2x-3x times (~60 sec) without effect - this comes up when forwarding slower than ~2 RTPM packets per second.

The problem looks like some AS-logic is trying to force framerate of a video, not just output received frames , so one of my questions is does AS looks for in-video-frame fps info in live streaming? why it can play faster, but can't play slower? How can I play video "by frames" not synchronizing video fps with RTPM packets timestamps?

On the other side, if I push packets faster than recorder, the video is just faster but almost fluent - I just can't get slower or stable stream (still very irregular speed).

I have analysed some NetStream values:

  • .bufferLength = ~0 or 0.001, incrasing when I forward packets extremaly fast (like targeting ~90fps)
  • .currentFPS = shows real FPS count seen in Video object, not incoming frames/s
  • .info.currentBytesPerSecond = ~8 kB/s to ~50kB/s depending on forwarding speed
  • .info.droppedFrames = frequently incrases, even if I stream packets like 2/sec! also jumps after long self-initiated-pause (but buffer is whole time 0!)
  • .info.isLive = true
  • .info.dataBufferLength = same as .bufferLength

It looks like AS is dropping frames, because of too rare RTMP packets receive - like expecting that they will arrive with internal-frame-encoded-fps-speed.

My currently best NetStream configuration:

chatStream.videoReliable = false;
chatStream.audioReliable = false;
chatStream.backBufferTime = 0;
chatStream.bufferTime =0;

Note that if I set bufferTime to 1 , video is paused until gathering "1 second of video" but this is not true - buffering is very slow, like assuming that video has FPS of 100 or 200 - even if I'm forwarding packets fast (like targeting ~15fps without buffer), the buffer is filing about 10-20 seconds.

Loop, of course, starts with keyframed video data and keyframe interval of sequence is about 15 frames.

Have you tried netStream.step(1)

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#step()

Also I would remove 'live' from the play() call.

Finally, maybe flash tries to sync to the audio like it does in regular timeline. Have you tried a video without audio channel?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM