同步两个AS3 NetStream

时间:2010-11-05 23:08:48

标签: actionscript-3 audio-recording rtmp netstream wowza

我正在编写一个应用,需要在播放支持音轨时录制音频流。我有这个工作,但在播放和录制开始之间存在不一致的差距。

我不知道我是否可以做任何事情来使每次同步完美,所以我一直在尝试跟踪每个流开始的时间,这样我就可以计算延迟并修剪服务器端。事实证明这也是一个挑战,因为在连接开始时似乎没有发送任何事件(据我所知)。我尝试过使用各种属性,比如流的缓冲区大小等。

我现在想的是,由于我录制的音频只是单声道,我可以在第二个立体声音轨上放置某种“控制信号”,我可以用它来确定声音何时开始录音(或者说棒)该通道中的整个支持轨道,因此我可以通过这种方式同步它们。这给我留下了将这个声音正确地注入NetStream的新问题。

如果有人知道这些想法是否有效,如何执行它们,或者某些替代方案,那将是非常有用的!一直在研究这个问题

4 个答案:

答案 0 :(得分:0)

唯一想到的是尝试使用元数据,Flash媒体流支持元数据和onMetaData回调。我假设您正在使用闪存介质服务器来输入音频并录制音频输出。如果在将音频流式传输回服务器时使用send方法,则可以将侦听音轨的播放头时间戳放入其中,因此当您将2个流返回服务器时,可以将它们正确地复用在一起。您还可以尝试使用元数据对流式传输到客户端的音频进行编码,然后尝试使用onMetaData进行同步。我不确定如何做到这一点,但第二种方法是尝试将2个流组合在一起,因为音频会返回,这样您以后就不需要对它们进行多路复用,或者将它附加到空白的视频流中。音轨......

答案 1 :(得分:0)

如果你要在 NetStream 中注入一些东西......像SOUND一样复杂......我想在这里最好选择 Socket 。你将直接读取字节。在 NetStream 上可能存在压缩,因此发送的数据不是原始声音数据 - 需要解压缩编解码器的一些类。当您最终获得原始声音数据时,使用 Socket.readUnsignedByte() Socket.readFloat()在其中添加输入,并使用<回写修改后的数据em> Socket.writeByte()或 Socket.writeFloat()

这是将背部注入音频的替代方案。


对于同步,它实际上非常简单。即使数据可能不会立即发送,有一件事仍然保持不变 - 时间。因此,当用户的音频完成后,只需将其与其他任何东西混合到后方轨道 - 时间应该保持不变。

IF 用户的互联网下载速度慢,因此他的回溯有不必要的中断 - 检查SWF是否数据缓冲到足以添加下一个声音缓冲区(如果我没记错的话,通常为4096字节) )。如果是,请继续播放用户的音频。

如果没有,请不要流式传输,并在数据重新开始后立即启动。

答案 2 :(得分:0)

根据我的经验,NetStream是Flash中最不准确和最脏的功能之一(NetStream:play2?!!),对于Flash的主要用途可能是视频播放来说,这是非常具有讽刺意味的。 尝试以可靠的方式将其与其他任何内容同步是非常困难的...事件和状态不是很直接,并且有多个问题可能会破坏您的同步。

幸运的是,netStream.time会非常准确地告诉你当前的播放头位置,所以你最终可以用它来确定开始时间,延迟,丢帧等...注意确定实际的开始时间有点棘手虽然。当您开始加载netStream时,时间值为零,但是当它显示第一帧并且正在等待缓冲区填充(尚未播放)时,时间值类似于0.027(取决于视频),因此您需要要非常仔细地监控这个值,以准确地确定事件。

使用NetStream的另一种方法是将视频嵌入到SWF文件中,这样可以使同步变得更加容易(特别是在编码时使用频繁的关键帧)。但是你会失去质量/文件大小比例(如果我没记错的话你只能使用FLV,而不是h264)。

答案 3 :(得分:0)

  

连接开始时似乎没有发送任何事件

确定.. NetStatusEvent.NET_STATUS由于NetConnections和Netstreams的多种原因而触发,您只需添加一个侦听器并处理NET_STATUS.info的内容

as3参考文档here,您正在寻找NET_STATUS.info