如何在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尝试像在常规时间轴中一样同步到音频。您是否尝试过没有音频通道的视频?