3

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

我已经从RTMPRed5 接收的协议中记录了一些音频和视频数据包,现在我试图通过将数据包推送到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= 显示在Video对象中看到的真实 FPS 计数,而不是传入帧/秒
  • .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;

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

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

4

1 回答 1

1

你试过 netStream.step(1)

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

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

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

于 2013-11-20T07:48:21.667 回答