actionscript-3 – AS3 NetStream AppendBytes寻求问题
我在AS3中遇到NetStream问题.我正在开发的项目允许用户浏览视频(本地)并播放.我遇到的问题是netStream.seek(0);从我可以告诉它没有做任何事情,虽然我进入NetStatusEvent函数并触发NetStream.Seek.Notify.我正在使用NativeProcess,以下功能使这有任何区别.
public function ProgressEventOutputHandler(e:ProgressEvent):void { videoByteArray = new ByteArray(); nativeProcess.standardOutput.readBytes(videoByteArray,nativeProcess.standardOutput.bytesAvailable); netStream.appendBytes(videoByteArray); } 我在这里错过了什么吗?我在使用netStream.seek(0);之前暂停netStream. 编辑: 为了解决这个问题,我按照VC的说明进行操作.我已经完成了以下操作: >移动了videoByteArray = new ByteArray();到我的init函数,还创建了tempVideoByteArray = new ByteArray();在这个功能. 我没有改变任何其他内容,现在视频无法加载.如果我允许在ProgressEventOutputHandler函数内创建新的ByteArray,则视频会再次加载. 解决方法
精简版 :
试试我粘贴的代码:Github Snippet链接 长版: 这个有点长,但希望它一劳永逸……不要担心砖墙的东西,墙壁被打碎.为了让您受到启发,请查看VC的一些内部演示:使用appendBytes的一个实验室: > MP4 Seeking Experiment:研究appendBytes帧数据访问和时间/搜索处理.实时帧字节仅使用AS3代码从MP4转换为FLV格式. PS:我将使用URLStream方法,因为这对那些加载本地或在线文件的人来说是一个更有用的答案.您可以从urlstream.progressEvent更改为常用的nativeProcess.progressEvent. 此答案假设您正在使用FLV和MPEG H.264视频& MP3或AAC音频. ffmpeg -i input.mp4 -c:v copy -c:a mp3 -b:a 128k -ac 2 -ar 44100 FLV_with_MP3.flv 这个假设很重要,因为它影响我们寻找的字节类型. >由于这是MPEG,第一个视频标签将保存AVC解码器配置字节,第一个音频标签保存音频特定配置字节.此数据不是实际的媒体帧,而是简单地打包为音频/视频标签. MPEG播放需要这些.可以在MP4容器内的STSD元数据条目(MOOV atom)中找到相同的字节.现在,下一个找到的视频标签将(或应该)成为视频的实际第一帧. 1)字节复制和检查值: 您正在寻找代表视频“标签”的字节.除了元数据标记之外,您现在可以期望“标记”表示音频或视频帧的容器.将标记字节放入“临时字节数组”有两种方法(我们将其命名为temp_BA). > ReadBytes(slow):在source_BA中的开始/结束范围内提取单个字节值 Readbytes解释:告诉Source将其字节读入Target.源将从其当前偏移(位置)向前读取长度.在阅读之前去正确的Source位置… Writebytes解释:告诉Target从Source复制一系列字节.从已知信息(来自Source)复制后速度很快.目标从当前位置开始向前写… 使用上述方法从特定的source_BA.position = x获取所需的标记字节到temp_BA. 要检查任何字节(其值),请使用以下方法更新int类型的某些变量: >阅读one-byte value:使用my_Integer = source_BA.readByte(); 注意:不要混淆.readByte();它使用类似的声音.readBytes()提取一个数值(字节),它将一块字节复制到另一个字节数组. 2)查找视频KeyFrame(或I帧): [视频标签与关键帧H264 / AAC的插图图片] 要查找视频关键帧 >从起始偏移量开始,使用while循环现在通过搜索每个字节的字节前进[07]的“9”(十六进制:0x09),当发现我们进一步检查前面的字节以确认它确实是一个真正的关键帧而不只是随机出现的“9”. 注意:为了读取3个字节的标签大小,我将显示一个自定义转换bytes_toInt()函数(因为处理器一次读取1,2或4个字节的整数,这里读取3个字节是一个令人讨厌的请求). 搜索提示:标记始终在跟踪中互相跟随.我们可以通过检查字节是否用于非关键帧(P帧)视频标签甚至某些音频标签来更快地寻求.如果是这样,那么我们检查特定的标签大小,现在增加我们的xPos以跳过这个新的长度.这样我们就可以跳过整个标签大小而不仅仅是单个字节.仅在我们有关键帧标记时停止. 3)从视频关键帧播放: 当你考虑它时,游戏就像一个逐帧的自动搜索.获得每个下一帧的预期速度由视频的编码帧速率定义. 所以你的播放功能可以简单地是一个每秒钟(或1000毫秒)获得X量视频标签(帧)的定时器.你这样做的例子是my_Timer = new Timer(video_FPS).当计时器运行并到达每秒的每个FPS切片时,它将运行append_PLAY();函数反过来运行get_frame_Tag();功能. > NS.seek(0):将NetStream置于“搜索模式”. (数字无关紧要,但必须存在于命令中).任何“前帧”缓冲区都被清除,它们将不会(图像)帧更新,直到.. play函数作为一个中间函数来管理事物而不会使用if语句等混淆get frame函数.管理事物意味着例如检查是否有足够的字节下载甚至根据Tag Size开始获取帧. 4)工作示例的源代码: 代码太长了..请参阅下面的link: 希望能帮助到你.虚电路 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |