HTML5 video.currentTime 未正确设置

HTML5 video.currentTime not being set properly

本文关键字:设置 video currentTime HTML5      更新时间:2023-09-26

我有一个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>

手动设置视频标签的当前时间属性,但是它正在寻求与我使用 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   
 

我正在使用Chrome版本30.0.1599.114作为Linux g6 3.2.0-54-generic #82-Ubuntu SMP上的浏览器

提前感谢您,任何帮助将不胜感激!

如果没有代码来测试这个答案,就会理论化一个可能的原因 -

如您所见,视频 FPS 为 29.97。我的猜测是Chrome浏览器(确实使用ffmpeg进行mp4解码)只是将FPS四舍五入到30 FPS。其中一个原因可能是更新通常以 60 Hz 同步到显示器刷新率。这意味着要获得"干净"的帧,视频帧速率以 30 FPS 运行,而不是用于模拟 NTSC 的 29.97(只是我关于浏览器如何处理这个问题的理论)。

这将为您提供:

@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 的速度运行。