2

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

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

我现在在想,由于我录制的音频只是单声道,我可以在第二个立体声轨道上放置某种“控制信号”,我可以用它来准确确定声音何时开始录制(或粘贴整个背景)跟踪该频道,以便我可以以这种方式同步它们)。这给我留下了将声音正确注入 NetStream 的新问题。

如果有人知道这些想法中的任何一个是否可行,如何执行它们或一些替代方案,那将非常有帮助!在这个问题上工作了一段时间

4

4 回答 4

0

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

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

as3 参考文档在这里,你正在寻找 NET_STATUS.info

于 2010-11-13T07:40:22.130 回答
0

根据我的经验,NetStream 是 Fl​​ash 最不准确和最肮脏的功能之一(NetStream:play2 ?!!),顺便说一句,看到 Flash 的主要用途可能是视频播放,这很讽刺。尝试以可靠的方式将其与其他任何东西同步非常困难......事件和状态不是很直接,并且有多个问题可能会破坏您的同步。

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

使用 NetStream 的替代方法是将视频嵌入到 SWF 文件中,这应该使同步更加容易(特别是如果您在编码中使用频繁的关键帧)。但是您将失去质量/文件大小比(如果我没记错的话,您只能使用 FLV,而不是 h264)。

于 2010-11-10T09:58:22.110 回答
0

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

于 2010-11-09T18:28:35.503 回答
0

如果您要向NetStream中注入一些东西......就像声音一样复杂......我想这里最好使用Socket代替。您将直接读取字节。可能对NetStream进行了压缩,因此发送的数据不是原始声音数据 - 需要一些用于解压缩编解码器的类。当您最终获得原始声音数据时,使用 Socket.readUnsignedByte() 或 Socket.readFloat() 添加输入,并使用Socket.writeByte()Socket.writeFloat ( )回修改后的数据。

这是将背面注入音频的替代方法。


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

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

如果没有,请不要流式传输,并在数据恢复后立即开始。

于 2010-11-09T19:23:25.583 回答