如何在不同速度下流畅播放FLV视频?

5
我需要以不同速率显示FLV的帧。
以下是一些示例:
- 用户将“刮擦”FLV帧(前/后)。 - 在用户交互时,FLV将需要以一半的速度播放。
目前我正在使用 LoaderMax和其VideoLoader对象来加载和播放FLV文件。我尝试使用 playProgress属性,但只显示FLV的关键帧。使用NetStream类的基本设置也得到了相同的结果。
作为解决方法,我播放FLV一次,并缓存BitmapData实例,其中我绘制/缓存视频的每一帧。完成后,我使用BitmapData Vector更新舞台上的位图。使用此方法进行刮擦/更改速度很好,但仍然需要用户看到(等待)序列一次,而它被缓存,这不太好。
有更好的想法如何做到这一点吗?
任何提示都有用,谢谢!

听起来你正在制作一个基于Web的视频编辑器。虽然我希望有人能给你一个有用的答案,但我怀疑你需要的不是Flash。也许有一种方法可以在浏览器插件中包装VLC。 - Brad
@Brad,它远非基于Web的视频编辑器。它是“富媒体”网站的一部分,将具有一些漂亮的预渲染内容,需要由用户进行交互式控制。 - George Profenza
1
@George Profenza - 我以前见过这样的做法,但是视频被导入到了Flash IDE中,我们通过时间轴来操作刮擦。我相信我们有第二个版本的视频用于慢动作播放版本,并在两个MovieClip之间切换。这是一种相当低技术含量的方法,不是没有问题,但我们解决了它们。我有一种感觉,你会很难使用普通的FLV进行渐进式下载来完成这个任务。 - James Hay
@James Hay - 非常感谢您的建议。几年前我做过类似的事情,因为嵌入式视频向前播放很好,但向后播放时插值效果很差。您说得对,我遇到的问题是渐进式FLV下载。我更喜欢使用单个FLV而不是两个,但这仍然是一种相当不错的技术。时间轴方法可以用于改变视频的速度,但不能用于单个视频的方向。 - George Profenza
@George Profenza - 哈哈,更像是一个解决办法,但我会把它复制下来以备记录。 - James Hay
显示剩余2条评论
2个回答

2
谢谢你的问题,它让我阅读了flv格式规范(来自第74页)并开始编写基于ByteArray的解析器。据我所知,有两种方法:

Body VideoTagBody The VideoTagBody 包含视频帧负载。

所以似乎可以将每个帧作为像素数据访问。
另一种方法是在元数据中设置帧速率为所需值,将flv写回ByteArray并保存到本地文件系统或使用NetStream.appendBytes()进行播放。

那么,理论上是否可以以字节数组的形式访问FLV文件,访问视频帧有效负载,从每个帧中获取紧密像素数据,并将其以相反的顺序添加到原始视频有效负载末尾并更新文件头中的元数据,或者克隆FLV作为字节数组,反转克隆的“帧”,并将其提供给新的NetStream? - George Profenza
@ George Profenza - 当我尝试跟踪一个6秒FLV的完整标签列表时,FlashDevelop会崩溃。也许是因为我跟踪了所有SCRIPTDATA标签。 - www0z0k
@www0z0k 谢谢!希望我能为你的努力投更多票! - George Profenza
@ George Profenza - 欢迎) 从.flv获取标签数组相对容易,但现在我必须研究所有音频和视频编解码器规范以获得所需的媒体数据访问权限。感到有些懒惰,但也很有兴趣,希望能完成。 - www0z0k
@George Profenza - 如果你从FMS播放视频,http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html#step%28%29可能会有用。另外,你知道在哪里可以获取完整的“Sorenson H.263 for flv”规范吗?我正在尝试使用http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf(从第236页开始),但很难将Adobe的描述与原始规范合并。 - www0z0k
显示剩余2条评论

1

我以前见过这样做,但视频是导入到Flash IDE中的,我们操纵时间轴进行了滑动。我相信我们有第二个版本的视频用于慢动作播放版本,并在两个电影剪辑之间切换。这是一个相当低技术的方法,不是没有问题,但我们解决了它们。我觉得你用普通的FLV使用渐进式下载会很困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接