我有一个
HTML5网页示例
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
function log(msg) { console.log(msg); }
$(document).ready(function() {
var video = document.getElementById("video");
video.load();
video.addEventListener('loadedmetadata', function(){
video.currentTime = 95.061728395;
});
});
</script>
<body>
<video id="video" preload="none" height="360" width="640">
<source src="news.mp4">
Your browser does not support this video.
</video>
</body>
</html>
手动设置视频标签的currentTime属性,但它正在寻找与我使用OpenCV / mplayer并寻求同一时间不同的帧.
使用javascript,我在一个有效的时间寻找视频,并且我给了一个帧,它通常在帧之前2帧.我在用
video.currentTime = 95.061728
在浏览器和
echo -n p | mplayer -ss 95.061728395 static / news.mp4
作为复制框架应该是什么的命令. OpenCV代码匹配mplayer框架寻求的内容.
从mplayer,视频格式是:
Playing static/news.mp4. libavformat version 53.21.1 (external) Mismatching header version 53.19.0 libavformat file format detected. [lavf] stream 0: video (h264), -vid 0 [lavf] stream 1: audio (aac), -aid 0, -alang und VIDEO: [H264] 640x360 24bpp 29.970 fps 500.4 kbps (61.1 kbyte/s) Clip info: major_brand: mp42 minor_version: 0 compatible_brands: isommp42 creation_time: 2011-09-27 14:41:05 Load subtitles in static Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family libavcodec version 53.35.0 (external) Mismatching header version 53.32.2 Selected video codec: [ffh264] vfm: ffmpeg (FFmpe`enter code here`g H.264) Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders AUDIO: 44100 Hz, 2 ch, s16le, 96.0 kbit/6.80% (ratio: 12001->176400) Selected audio codec: [ffaac] afm: ffmpeg (FFmpeg AAC (MPEG-2/MPEG-4 Audio)) AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample) Starting playback... Unsupported PixelFormat 61 Unsupported PixelFormat 53 Unsupported PixelFormat 81 Movie-Aspect is undefined - no prescaling applied. VO: [vdpau] 640x360 => 640x360 Planar YV12
我在Linux g6 3.2.0-54-generic#82-Ubuntu SMP上使用Chrome版本30.0.1599.114作为浏览器
提前谢谢,任何帮助表示赞赏!
最佳答案 没有代码来测试这个答案将理论化一个可能的原因 –
如你所见视频FPS是29.97.我的猜测是Chrome浏览器(使用ffmpeg进行mp4解码)只需将FPS四舍五入到30 FPS.一个原因可能是更新通常以60 Hz同步到监视器刷新率.这意味着要获得一个“干净”的帧,视频帧速率以30 FPS而不是29.97运行,这用于模拟NTSC(仅仅是关于浏览器如何处理此问题的理论).
这会给你:
@30.00 FPS frame 2852
@29.97 FPS frame 2849
这相当于你经历的差异(3帧).
为了弥补这一点,您可以通过这种方式重新计算您的时间基准:
newTime = oldTime / 30 * 29.97;
这将调整时间:
95.061728395 / 30 * 29.97 = 94.96666666660501
如果我们使用这个时间(对于currentTime)使用30 FPS,我们将获得:
94.96666666660501 * 30 => frame 2849
好像它以29.97 FPS运行.