0

我想用 adobe air 制作一个应用程序来观看视频。优先级是使用 seek(framneNumber) 进行粒度非常细的搜索。我正在使用来自 FLVPlayebackAS3.swc 的 FLVPlayback 对象:

import fl.video.FLVPlayback;

首先,我不了解我的搜索精度:它真的是在任何帧中还是仅在 GOF 的 I 帧中(视频压缩中使用的帧组 - 编码)。

然后我正在寻找一种干净的方式来寻找框架。我使用了这段代码:

    private function getFrameRate():int {
        if(playerFLV.metadataLoaded) return playerFLV.metadata.videoframerate;
        else return -1;
    }

    private function seek(frame:int):void {
        if(getFrameRate()>0)
            playerFLV.seek( frame / getFrameRate() );
    }

但有时似乎不够精确

4

1 回答 1

1

seek(time:Number) 函数需要一个时间 int,其精度限制为毫秒的 3 位小数。根据您上面的计算,一个框架可能会超出这个范围。

作为快速检查,您确定 getFrameRate() 是否返回任何内容?不应该是:

if(playerFLV.metadataLoaded) return playerFLV.metadata.framerate;

metadata.framerate 将为您提供 flv 帧速率,如果您不关心音频,可以尝试使用:

playerFLV.metadata.videodatarate

至于两部分的问题:

RE-首先我不了解我的搜索精度:它真的在任何帧中还是仅在 GOF 的 I 帧中(视频压缩中使用的帧组 - 编码)。

如果视频是渐进式下载:

Seek 将搜索到某个时间,然后播放组件将显示之后的第一个关键帧。

如果视频正在流式传输:

FMS 将在该确切时间生成所需的关键帧。

如果您不关心文件大小,也许另一种解决方案是使用更多关键帧对 flv 进行编码,或者如果您确实控制了视频的编码并且它们是渐进式的,那么我建议在您想要寻找视频的每一帧上添加 Que 点到。

于 2012-04-29T15:30:05.007 回答