【发布时间】:2015-08-24 12:40:14
【问题描述】:
我在使用 AS3 中的 NetStream 时遇到问题。我正在进行的项目允许用户浏览视频(本地)并播放。我遇到的问题是netStream.seek(0); 据我所知它没有做任何事情,尽管我进入了一个 NetStatusEvent 函数并触发了NetStream.Seek.Notify。我使用的是 NativeProcess,下面的函数有什么不同。
public function ProgressEventOutputHandler(e:ProgressEvent):void {
videoByteArray = new ByteArray();
nativeProcess.standardOutput.readBytes(videoByteArray, 0, nativeProcess.standardOutput.bytesAvailable);
netStream.appendBytes(videoByteArray);
}
我在这里遗漏了什么吗?我在使用 netStream.seek(0); 之前暂停了 netStream。
编辑:
为了解决这个问题,我按照 VC.One 的说明进行了以下操作:
将
videoByteArray = new ByteArray();移至我的init 函数,并在此函数中创建tempVideoByteArray = new ByteArray();。更新我的 ProgressEventOutputHandler 函数,使其不再为 videoByteArray 创建新的 ByteArray 并更改此行 -
nativeProcess.standardOutput.readBytes(videoByteArray, videoByteArray.length, nativeProcess.standardOutput.bytesAvailable);
我没有更改任何其他内容,现在视频无法加载。如果我允许在 ProgressEventOutputHandler 函数中创建一个新的 ByteArray,视频会再次加载。
【问题讨论】:
-
该代码设置对于查找来说并不灵活。您应该在函数之外创建
videoStream仅一次,然后在每个进度事件中填充它(当数据来自 FFMPEG 时,它将触发多次,这里就像您销毁最后一个数据并制作一个新的。好吧,但是想象一下最后的 progressEvent 给出了 5 分钟视频的最后 10 秒,现在当你的(新)字节只保留最后 10 秒时,你怎么能找到 2 分钟呢?如果你只填充一个 byteArray 它将包含所有字节,您可以在其中查找。 -
你真的需要两个字节数组。 Bytes One 包含完整的字节,并且会随着它们的进入而增长。像
xxxx.readBytes(videoStream, videoStream.length, xxxx.bytesAvailable);这里的 xxxx 只是为了缩短代码,但你知道我的意思。 Bytes Two 是一个“临时”缓冲区,您可以用特定的帧字节填充并附加。 Bytes Two 可以通过示例temp_BA.clear();清除以重新使用,因此无需使用= new..,因为这实际上将多个字节数组添加到内存中,所有这些字节数组都称为相同的名称(编译器只是将它们视为 1000 个唯一引用 ID)。 -
无论如何我的意思是......寻找
appendBytes是自我控制的。您决定输入哪些字节,以便从videoStream中选择正确的字节范围并复制到temp_BA,然后附加 temp_BA。想去别处寻找?清除 temp_BA 并再次从 videoStream 中抓取。您使用两个,以便主要的 videoStream 保持不变,以避免在“调整它”的同时也提供它等问题。我稍后会详细说明.. 寻找关键帧的字节并附加它 -
更新问题以包含 VC.One 的 cmets
-
@AntBirch 你试过
NetStream.appendBytesAction()吗?另外,看看这个question。
标签: actionscript-3 flash ffmpeg air netstream