flowplayer flash seek错误第二次

时间:2014-01-17 22:03:36

标签: flash flowplayer seek

我遇到一个问题,即flowplayer的搜索方法没有达到指定的第二个 - 它大概是8秒而不是10秒。

Jsfiddle Example

var $player = $('#player');
var video = flowplayer($player[0], {
    src: 'http://releases.flowplayer.org/swf/flowplayer-3.2.18.swf',
    wmode: 'opaque'
}, {
    clip: {
        autoPlay: true,
        onCuepoint: [
            [10000], // 10 Seconds
            function () {
                video.pause();
                alert('10 second Cuepoint reached');
            }]
    }
});

$('a').click(function (e) {
    e.preventDefault();
    video.seek(10);   
});

很明显,在达到提示点之前,点击链接后会有几秒的播放时间,并且还可以通过检查流程控制栏中的时间来确认。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

当Flowplayer寻找当前剪辑的指定时间时,它将从附近的关键帧开始播放。

关于伪流程(http://flash.flowplayer.org/plugins/streaming/pseudostreaming.html)的Flowplayer页面上描述了关键帧概念:

  

关键帧是完整的视频帧(或图像),以给定的间隔插入到视频片段中。关键帧之间的帧是“部分”的,因为它们需要显示其他帧(参考帧)。间隔可能会减少,以适应场景变化和高动态场景。在伪流程中,用户只能寻找具有完整关键帧的位置。如果您没有足够的关键帧,那么您的视频就不适合细粒度搜索。使用良好的编码软件,您可以设置关键帧间隔,最小关键帧间隔和场景变化的灵敏度。

我在你的Jsfiddle示例中分析了示例视频,它的关键帧有0.00秒,4.00秒,7.72秒,10.76秒,13.64秒等等。这就是为什么你的视频开始时间为7.72秒而不是10.00秒,当你寻求10秒时。

为了能够寻找任何秒,您应该考虑为视频每秒添加关键帧。 Ffmpeg通过-force_key_frameshttps://ffmpeg.org/ffmpeg.html)支持此功能。

答案 1 :(得分:1)

实际上,您的问题中提到的行为不是流媒体的特殊问题,但它与NetStream对象和流本身有关。

要了解更多信息,请首先查看您示例中使用的videoMetaData

avcprofile = 66
videocodecid = avc1
trackinfo = [object Object],[object Object]
avclevel = 30
duration = 25.309750566893424
width = 500
height = 300
aacaot = 2
videoframerate = 25
moovposition = 44
audiocodecid = mp4a
seekpoints = [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
    0 = [object Object]
        time = 0
        offset = 8556
    1 = [object Object]
        time = 4
        offset = 302415
    2 = [object Object]
        time = 7.72
        offset = 687933
    3 = [object Object]
        time = 10.76
        offset = 1169520
    4 = [object Object]
        time = 13.64
        offset = 1593324
    5 = [object Object]
        time = 17.64
        offset = 2082047
    6 = [object Object]
        time = 21.64
        offset = 2434386
audiosamplerate = 44100
audiochannels = 2

在这里,我们将重点介绍seekpoints,它会显示我们的视频流keyframes。有时,MetaData包含keyframes而不是seekpoints,有时视频既不包含seekpoints也不包含keyframes,在这种情况下我们必须将其注入以避免播放问题,如果可能的话。

所以在我们的例子中,我们有7 keyframes

- 1st keyframe : at 0:00
- 2nd keyframe : at 0:04
- 3rd keyframe : at 0:07.72
- 4th keyframe : at 0:10.76
- 5th keyframe : at 0:13.64
- 6th keyframe : at 0:17.64
- 7th keyframe : at 0:21.64

所以当看到NetStream.seek()的定义时:

  

寻找最接近指定位置的关键帧(在视频行业中也称为I帧)。关键帧放置在从流的开头以秒为单位的偏移处。

我们可以理解NetStream对象将转到指定位置或时间最近的关键帧,我们可以在指定时间之前说出最近的关键帧。这就是为什么当你试图寻找10th second时,玩家将在第二个7.72直接进入关键帧。此外,如果您尝试转到15th秒,则播放器将从13.64处的关键帧进行播放。

那么如何避免这样的问题呢?

  • 每秒放一个关键帧,直接作用于视频文件的大小。为此,您可以使用ffmpeg,例如,使用以下命令:

      

    ffmpeg -i original_video.mp4 -force_key_frames" expr:gte(t,n_forced * 1)" new_video.mp4

    当然你必须使命令适应你的编码预设。

  • 使用流媒体服务器,如Adobe Media Server,Wowza,Red5,...您可以配置以避免此类问题。

  • 使用具有特定模块的网络服务器来流式传输视频,例如用于Apache的H264流模块,Nginx http mp4模块,......

希望所有可以帮到你的事。