如何在 ActionScript 中以来自 NetStream 的"incoming frames speed"(非视频内部)播放 FLV 视频



如何在NetStream帧到达时立即播放它们,而无需任何额外的AS帧速率逻辑?

我已经从Red5接收RTMP协议记录了一些音频和视频数据包,现在我正在尝试通过向带有递增时间戳的数据包推送到NetStream来循环将其发送回闪存客户端。循环序列的长度约为 ~20 秒,由大约 ~200 个 RTMP 数据包(视频数据/音频数据)构建而成

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

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

问题看起来像一些AS逻辑试图强制视频的帧速率,而不仅仅是输出接收的帧,所以我的一个问题是AS是否在实时流中查找视频帧内fps信息? 为什么它可以播放得更快,但不能播放得更慢?如何"按帧"播放视频,而不将视频 fps 与 RTPM 数据包时间戳同步?

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

我分析了一些NetStream值:

  • .bufferLength = ~0 或 0.001,当我转发数据包时增加极快(如定位~90fps)
  • .currentFPS = 显示真实的 FPS在对象中看到Video计数,而不是传入帧/秒
  • .info.currentBytesPerSecond = ~8 kB/s 至 ~50kB/s,具体取决于转发速度
  • .info.droppedFrames = 经常增加,即使我像 2/秒一样流式传输数据包!在长时间的自启动停顿后也会跳跃(但缓冲是整个时间0!
  • .info.isLive = 真
  • .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 帧。

你试过 netStream.step(1)

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

我也会从 play() 调用中删除"live"。

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

相关内容

  • 没有找到相关文章

最新更新