我遇到一个问题,即flowplayer的搜索方法没有达到指定的第二个 - 它大概是8秒而不是10秒。
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);
});
很明显,在达到提示点之前,点击链接后会有几秒的播放时间,并且还可以通过检查流程控制栏中的时间来确认。
提前感谢您的帮助。
答案 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_frames
(https://ffmpeg.org/ffmpeg.html)支持此功能。
答案 1 :(得分:1)
实际上,您的问题中提到的行为不是流媒体的特殊问题,但它与NetStream
对象和流本身有关。
要了解更多信息,请首先查看您示例中使用的video的MetaData
:
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模块,......
希望所有可以帮到你的事。