如何在ActionScript中以NetStream的“传入帧速度”(不是视频内部)播放FLV视频

时间:2013-11-06 12:35:59

标签: actionscript-3 flash video red5 netstream

如何在没有任何额外AS帧速率逻辑的情况下立即播放NetStream帧?

我录制了一些音频& Red5收到的来自RTMP协议的视频数据包,现在我试图通过递增时间戳将数据包推送到NetStream,将其发送回闪存客户端。循环序列的长度约为20秒,nad是从大约200个RTMP数据包构建的(VideoData / AudioData)

环境:本地主机上的Flash客户端和服务器,没有网络瓶颈,视频是由同一个Flash客户端提前H.264编码的。

它通常有效,但视频不是很流畅 - 有很多冻结,减速和长时间停顿。 较慢的数据包传输导致更多的暂停和冻结。,即使是极端长的暂停,例如传输整个序列2x-3x次(~60秒)而没有效果 - 当转发速度低于~2 RTPM数据包时出现这种情况每秒。

问题看起来有些AS逻辑试图强制视频的帧速率,而不仅仅是输出接收到的帧,因此我的一个问题是 AS在视频中寻找 - 实时流媒体中的帧fps信息?为什么它可以播放得更快,但播放速度不是很慢?如何“逐帧”播放视频而不是将视频fps与RTPM数据包时间戳同步?

另一方面,如果我比录音机更快地推送数据包,视频速度更快但几乎流畅 - 我只是无法获得更慢或稳定的流(速度仍然非常不规律)。

我分析了一些NetStream值:

  • .bufferLength = ~0或0.001,当我转发数据包时输入 极端快速(如目标~90fps)
  • .currentFPS =显示真正的FPS 在Video对象中看到的计数,而不是传入的帧/ s
  • .info.currentBytesPerSecond = ~8 kB / s至~50kB / s,具体取决于 转发速度
  • .info.droppedFrames = 经常加入,即使我 像2 / sec!这样的流包也会在长时间自启动暂停后跳转(但缓冲区 是整个时间0!)
  • .info.isLive = true
  • .info.dataBufferLength =与.bufferLength
  • 相同

看起来AS正在丢帧,因为收到的RTMP数据包太少 - 比如期望它们会以内帧编码的fps速度到达。

我目前最好的NetStream配置:

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

请注意,如果我将bufferTime设置为1,则会暂停视频直到收集“1秒视频”,但这不是真的 - 缓冲非常慢,就像假设视频的FPS为100或200 - 即使我快速转发数据包(比如没有缓冲区定位~15fps),缓冲区也会提交大约10-20秒。

循环,当然,从关键帧视频数据开始,序列的关键帧间隔约为15帧。

1 个答案:

答案 0 :(得分:1)

您是否尝试过netStream.step(1)

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

此外,我会从play()调用中删除“live”。

最后,也许flash尝试像在常规时间线中一样同步到音频。您是否尝试过没有音频频道的视频?