者 | 潘文捷
编辑 | 黄月
电视剧《开端》2022开年即吸引了不少观众的目光,剧中主人公一次次从公交车上惊醒,一次次地尝试制止公交车爆炸,拯救无辜生命,又一次次失败,他们一次次地向警察解释,一次次被质疑,再一次次陷入循环中。
这种多次回到过去、重复某一时间段人生的影视剧设定并不少见,从上世纪90年代的电影《土拨鼠之日》到2011年杰克·吉伦哈尔主演的《源代码》,主人公都因为种种原因陷入类似的循环往复之中,既包含着某种逃不出去的折磨,又有着可以重回过去、做出改变的机会。
《开端》的主角用“循环”一词解释自己的经历,故事发生的主要空间又是公交车,日复一日重复同样的路线,本身就是一个常见的循环意象。《开端》剧中人物也提到了《夏日大作战》《穿越时空的少女》《你的名字》等日本动漫,其中《穿越时空的少女》是日本小说家筒井康隆1967年的一部小说,故事包含了自愿进入时间循环的情节,曾被多次改编,在2006年动画电影上映之前基本不为西方世界知晓。
时间循环的设定其实挺常见。《开端》属于时间循环的一个明确类型,即“土拨鼠日环”。这一名称来源于1993年的美国电影《土拨鼠之日》(Groundhog Day),虽然该影片并非使用此种设定的第一部作品,却在流行文化中确立起了一种时间循环的套路。
在《土拨鼠之日》中,气象播报员菲尔来到宾夕法尼亚一个小镇上报道当地的土拨鼠日庆典,却被永远地困在了2月2日,也就是土拨鼠之日这一天。“土拨鼠日环”的特征在于,角色陷入时间循环的情节,注定要一遍又一遍地重复一段时间(通常是一天),直到某些事情得到纠正。在《开端》里,这个需要纠正的事情就是公交车爆炸。
“土拨鼠日环”设定的另一方面在于“抗涟漪效应记忆”,这意味着通常只有一个角色或一组角色的大脑不受重置的影响,可以保留每一次循环的记忆——只有他们能够意识到究竟发生了什么,而其他人只能记住新一轮循环中的现实。在电视剧《开端》里,主角等人早在车辆爆炸之前就开始报警,并说出了相当详细的内情,引发了各方面的怀疑。没等警官自我介绍,主人公就叫出了他的名字,甚至说出了他右手无力等特点,更令当事人大吃一惊。可以说,主角通过在多次循环的屡次失败中获取经验,把“后见之明”转化为在当下这个循环里的“先见之明”。他们一方面拥有大量的信息储备,在观众看来有着因信息差获得的碾压式快感,另一方面也倍感孤独,没有人知道他们重复了多少次这一天的生活,困在其中无法逃脱。我们在《土拨鼠之日》里看见菲尔孤单无助,在《开端》里见证共同进入循环的男女主角感情迅速升温、相依为命,都源于“抗涟漪效应记忆”的设定。
陷入时间循环之人究竟如何才能从中逃脱呢?《土拨鼠之日》里的菲尔发现,就连他自杀都无法终止循环,于是开始进行各种人生尝试,比如抢劫运钞车、偷走土拨鼠、掌握冰雕艺术、利用循环的时间学琴知道可以弹奏拉赫玛尼诺夫的程度,并不断耍花招向一位女士求爱却屡被识破。直到他开始丰富自己,帮助他人,并真正地获得了这位女士的青睐,时间循环才最终得以打破。在土拨鼠日环的设定中,角色从连续的循环中学习,由此越来越深入地了解他们的环境和周围的人物。菲尔在循环中度过了多少天?按照英国《独立报》作者Christopher Hooton的统计,我们在电影中可以看到其中37天,但实际需要的时间可能在30年(本剧导演、编剧哈罗德·雷米斯的估计)到一万年(根据佛教教义灵魂进化到下一层次所需要的时间)之间。
至于主人公为什么会进入时间循环,《土拨鼠之日》并没有给出合理的解答。想要做出令人信服的解释,让这一设定能够自圆其说,那么故事常常会往科幻方向发展。电影《源代码》给出的答案是“科学”——科学家利用特殊仪器,柯尔特可以反复“穿越”到列车爆炸案中遇害的死者身体里,每次都只能回到爆炸发生前的8分钟。
由于“土拨鼠日环”是一个不断探索发现、解决问题的过程,叙述变得如同一个互动谜题,使得这一设定尤为适合推理作品。西泽保彦《死了七次的男人》就是这样的设定,因为“我”可以循环九次,而外公在这九次里反反复复死了七次,所以“我”必须找到让外公活下来的方法。在国产推理作品中,张小猫的《逆时侦查组》也采用了类似的设定——主角拥有能够不定期重复经历五次同一天的逆时能力,他依靠这种能力一次次回到案发之前进行侦查,屡屡破获重案,在他人眼里如有神助。这些做法也可以被纳入“新本格”之中。经典推理小说的逻辑已经用了超过百年,用时间循环这类来自科幻、奇幻作品的特殊逻辑,替换或更新传统套路,也为推理小说注入了新的生机。
如果说本格派推理追求的是逻辑的极致,社会派推理的重点当然是阐述社会议题。从《开端》里我们看到,随着循环一次次发生,各个次要角色的身份也被一一解锁,他们有着自己的经历背景、处于特定的社会阶层、与某些社会事件挂钩,这个科幻推理故事由此具备了更多的社会派元素。除了次要角色的身份以外,一次次进入循环的男主角自身也在发生改变,比如开始反思自己崇尚的暴力美学是否有害于社会。
也别忘了,《开端》男主角的身份是一位游戏架构师!“土拨鼠日环”不仅出现在小说和影视剧中,和游戏的关联也是极其密切的。从角色的角度来说,任何可存档的游戏都能被视为玩家手动激活的“土拨鼠日环”,毕竟他们必须一遍遍地重复,在相同的剧情里学习探索,直到做了正确的事情才得以通关。无怪乎《开端》的主角总是把进入循环的经历和游戏进行比较。
“土拨鼠日环”看似是在利用时间进行游戏,背后其实是不同的时间观念在发挥作用。
世界上的许多文化中都有时间循环的痕迹——佛教里有轮回之说;中国传统文化中也有类似的看法,一些中国思想家认为宇宙是循环的生命体,死亡意味着重生,这也体现为四季的循环;古代的西方人也从星星的周期运动里体悟到了类似的规律。
而基督徒认为时间是线性的,历史朝着一个确定的目标发展,这被称为teleos(终极目标)。到了现代工业社会,钟表的时间以统一的标准——1小时为60分钟——作为切割,可以精准计算,时间被认为是均质的、不可逆的。或许可以推测,故宫之所以设有专门的钟表馆,也与钟表进入中国、公元纪年被采用,中国人传统的时间观念发生翻天覆地变化有关。
尼采最著名的思想之一是永恒轮回,对于海德格尔来说,永恒轮回的问题是“最繁重的思想”,也许是“思想的思想”。尼采拒绝时间的线性概念,他认为人死后不会去到另一个地方,我们实际上是在一遍又一遍地重温生活;我们在过去无数次地体验过我们现在所过的生活,在未来也将经历无数次。
这种理念听起来好像会将我们带入一种虚无,就像当代社会打工人日复一日、年复一年做着同样的工作,看着套路重复的肥皂剧,听着套路重复的网络神曲,有过很多等待和希望,但是最终什么都没有发生。在尼采这里,永恒轮回并不是这么一回事。与期待来世拯救的基督徒相反,尼采不认为有比此世更重要的时间与世界。他提倡恢复古代的时间观念,由于时间循环重复,所以我们生命中的“每一个痛苦、每一个快乐、每一个念头、每一个叹息和每一个难以言喻的小事或大事”都必须以同样的顺序返回自身,那么我们必须想好自己是否渴望这件事一次又一次地发生,这意味着,即便是瞬间也无比重要,也就是说,此生的生命就是一切。
参考资料:
《思想史:从火到弗洛伊德》[英] 彼得·沃森 著 胡翠娥 译 译林出版社 2018
《世界哲学简史》[美] 罗伯特·C·所罗门 著 梅岚 译 后浪丨江西人民出版社 2017
Christopher Hooton: Groundhog Day is 25 years old but fittingly eternal
https://www.independent.co.uk/arts-entertainment/films/features/groundhog-day-2018-25-years-anniversary-date-film-bill-murray-andie-mcdowell-harold-ramis-days-time-loop-a8191111.html
Time Travel in Popular Media: Essays on Film, Television, Literature and Video Gamesby Matthew Jones(Editor),Joan Ormrod(Editor)McFarland & Company (March 13, 2015)
网页中添加视频、声音、动画等,可以增强用户体验。在HTML5之前,为网页添加多媒体的唯一办法,就是使用第三方的插件(如,Adobe Flash等)。
HTML5中,提供了对多媒体的原生支持,只需通过 video 元素,就可以向网页嵌入视频、电影或音频资源,通过 audio 元素向网页嵌入音频资源,省时省力。
HTML中嵌入视频和音频代码
在HTML5时代,在网页中嵌入视频非常简单,只需要一个 video 元素,并设置它的 src 属性,使其链接一个视频地址就可以完全搞定了,这个太esay了
<video src="media/vedio.mp4"></video>
把这个网站在IE8中打开一看,网站上除了一片空白外,什么也没有,这是为什么呢?
原来 video 是HTML5最新引入的元素,并不是所有浏览器都支持它,IE8及以下版本都无法识别 video 标签。如果浏览器不识别 video标签,则会忽略它,当做什么都没有。这就是网站上一片空白的原因。
这个问题好解决,只需在 video 标签之间放置文本信息,不支持 video 标签的老浏览器,会显示 video 标签之间的文本信息,以提示用户浏览器不支持 video,就这么简单!
<video src="media/vedio.mp4">
你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!
</video>
在IE8上打开一看,确实显示了提示文本,这下好多了,至少用户知道自己的浏览器不能播放视频,该换浏览器了。
下载了Opera浏览器的最新版本25.0,打开一看,怎么还是一片空白外!Opera浏览器明明是支持video标签的,那又是为什么呢?
这个就得从视频的编码格式说起了。video 元素支持三种视频格式:Ogg、MP4、WebM。
Ogg是带有Theora视频编码和Vorbis音频编码的文件,后缀名为 .ogg;MP4是带有H.264视频编码和AAC音频编码的MP4文件,后缀名为 .mp4;WebM是VP8视频编码和Vorbis音频编码的文件,后缀名为 .webm。
这个Opera浏览器呢,它可以支持ogg,但不支持mp4。由于Opera支持video标签,故video标签之间的文本信息没有显示出来,但它不支持ogg,所以就不进行播放,最终导致页面出现一片空白。这下可怎么办呢?
其实办法有的是,我们可以从网上下载一副图像,放到视频播放窗口,如果视频无法播放,就显示这张图片,是不是更好呢?从网上下载一张美女图片,干脆叫beauty.jpg吧。那这个图像怎么添加到视频窗口呢?
video标签有个poster 属性,就是专门在视频窗口放置图片的。poster是一个video的占位符,无论什么情况下,只要视频还没有播放(视频下载过程中、视频不存在、不支持该视频类型、用户点击播放按钮前),就会显示该图像,可以看做是视频播放之前插入的宣传画或海报。
<video src="media/vedio.mp4" poster="img/beauty.jpg">
你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!
</video>
在Opera浏览器上刷新一下,真的有一个美女冲着自己微笑呢。虽然视频没有播放出来,这回心情却是好多了。
那我可不能一天到晚只看美女呀,视频还是还是要想办法播放出来的。既然Opera浏览器不支持mp4,我们就换成需要ogg吧,这样就肯定没问题了。
我想了想,这个办法不好,万一某个浏览器只支持支持ogg,不支持mp4呢。这年头,什么都缺,就是不缺点子,随便在网上一搜,办法就有了。
在 video 元素中添加 source 元素,就可以解决这个问题。在source 元素中,通过 src 属性指定视频的地址,通过 type 属性指定视频的类型,以帮助浏览器决定是否能播放该视频。并且,在 video 元素中可以添加任意多个source 元素,让不同的 source 元素链接到不同的视频文件。
这样的话,当浏览器发现 video 元素时,首先会查看它本身是否定义了 src 属性。如果没有,就会检查 source 元素。浏览器会逐个查看这些视频源,直到找到一个可以播放的视频。一旦找到,就会播放它并忽略其他的视频源。我们干脆添加两个source,一个是mp4,一个是ogg,这下视频是一定能播放出来了。
<video poster="img/beauty.jpg">
<source src="media/vedio.mp4" type="video/mp4">
<source src="media/vedio.ogg" type="video/ogg">
你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!
</video>
在Opera浏览器上又刷新一下,只有美女冲着我微笑,视频还是没播放出来。唉,太粗心了,忘记添加播放视频的控件了。
在video标签中,通过添加controls 属性来为视频添加播放控件,方便用户执行播放、暂停操作和音量控制。
<video poster="img/beauty.jpg" controls>
(此处略去500字…)
</video>
在Opera浏览器上又刷新一下,效果真的不一样,这次不仅看到美女,还看到了视频控件。用鼠标猛戳一下那个播放按钮,哈哈,不错,真的听到美妙的旋律。我们的ogg文件,终于播放出来了,让我们好好享受一下吧O(∩_∩)O。
听了一会,忽然一想,不对呀,我刚才点了播放按钮后,等了半天才听到声音。能不能我一点播放按钮,就立即播放呢?
原来视频也是需要下载缓存的,点击播放按钮后,首先缓存,然后才播放的。那能不能在页面加载的同时就缓存呢。这样,用户点击播放后,就不必等待了。
这当然可以,在video标签中,通过添加preload属性来为视频添加预加载功能,在页面加载的同时加载视频。
<video poster="img/beauty.jpg" controls preload>
(此处略去500字…)
</video>
关于 preload 属性,稍微再啰嗦一点,就是可以把它设置为 metadata,让浏览器仅仅预加载视频的基本信息,如尺寸、时长、以及一些关键的帧。这样的话,在开始播放之前,浏览器可以提前计算视频的显示尺寸。
既然一切都OK了!让我们看看mp4是不是能正常播放。下载最新版的Google Chrome 38.0浏览器,打开网页,猛戳一下播放按钮。
等等~,等等~,不对,怎么只有声音没有画面,明明是mp4格式的文件呀?使用暴风影音试了一下,是有画面的呀!
辛辛苦苦又在网上搜了一番,花了整整586秒,终于找到了答案。mp4视频需要h.264编码格式才会有图像的。
找了一个 h.264 编码格式的 mp4 试了一下,不错,确实有图像了!看了半天,原来是一部老外的电影,叽里咕噜一阵,一句话也没听懂。那O(∩_∩)O~,能否提供中文字幕呢,这样就不必费老大劲去听了!
HTML5中,通过在video元素添加track元素为视频添加字幕。字幕文件有两种格式:WebVTT和TTML。WebVTT是Web视频文本轨迹(Web Video Text Track),是UTF-8编码格式的文本文件;TTML是时序文本标记语言(Timed Text Markup Language),是XML格式的文件。两种文件的具体格式,已经超出我们的讨论范围。
video元素支持添加多个track元素,不同的track元素链接到不同的字幕文件。用户可以在各个字幕间进行切换。
<video poster="img/beauty.jpg" controls preload>
<track src="en_track.vtt" kind="subtitles" srclang="en" label="English" default>
<track src="cn_track.vtt" kind="captions" srclang="zh" label="简体中文">
</video>
track元素中,src属性指定字幕文件的URL;srclang属性字幕文件的语言类型,若kind 属性值是 "subtitles" 时,该属性必需的;label 属性指定字幕标签,每个字幕元素必需设置一个唯一不重复的标签,切换字幕时,会显示标签的名称;kind指定字幕内容类型,只能是subtitles、captions、descriptions、chapters、metadata 之一;default属性指定是否是默认字幕,如果一个都没指定,将不会自动显示字幕。
除了字幕外,我还希望对视频进行过多的控制,比如让视频自动播放、循环播放、默认静音,以及视频窗口的尺寸等等,这些都能做到吗?
这已经不是什么事了,video 元素已经提供了相关属性,根据需要设置相应的属性就可以了。这些属性及含义见表 23:
HTML中嵌入视频和音频代码
哦,原来这么简单呀!那就到此为止吧,网页中嵌入视频的全部代码都在这里,就打包给你吧!
<video width="300" poster="img/beauty.jpg" controls preload autoplay loop muted>
<source src="media/vedio.mp4">
<source src="media/vedio.ogg">
<track src="en_track.vtt" kind="subtitles" srclang="en" label="English" default>
<track src="cn_track.vtt" kind="captions" srclang="zh" label="简体中文">
你的浏览器已经老掉牙了,不支持video,还不赶快使用现代浏览器O(∩_∩)O~!
</video>
睁大眼睛一看,却只有7行代码。然而,就这区区7行代码,可把他折磨得够呛。
看着这一切都全部搞定,他仰望着天空,长长呼了一口气,显得是那么的放松,那么的惬意。此时,他闭上眼睛,在自己的梦幻世界里遨游!
有了在网页中嵌入视频的经历,要在网页中嵌入音频,那简直就是小菜一碟了。只要把vedio元素换成 audio 元素,就全部搞定。
但需要了解的是,audio 所支持的音频格式只有Ogg Vorbis、mp3 和 wav。还要知道,由于音频没有画面,也就没有 width、height、poster 属性,而其他属性都支持,并且跟视频的含义相同。
网页中嵌入音频的代码如下:
<audio controls preload autoplay loop muted>
<source src="media/audio.mp3">
<source src="media/audio.wav">
<source src="media/audio.ogg">
你的浏览器已经老掉牙了,不支持audio,还不赶快使用现代浏览器O(∩_∩)O~!
</audio>
希望可以通过这篇文章,能够给你得到帮助。(感谢一键三连)
学习深入理解HTML5的audio和video。
在HTML5播放一个视频,很简单,只需要一行代码:
<video src="resources/dadaqianduan.mp4" autoplay></video>
了解视频文件格式:
Audio Video InterLeaved .avi
Flash Video .flv
MPEG-4 .mp4
Matroska .mkv
Ogg .ogv
音频和视频编解码器
编解码器可以理解为一些算法代码,用于处理视频,音频或者其元数据的编码格式。对音频或视频文件进行编码,可使得文件大大缩小,便于在因特网上传输。
音频编解码器:
MP3,使用ACC音频
Wav,使用Wav音频
Ogg,使用OggVorbis音频
视频编解码器:
MP4,使用H.264视频,AAC音频
WebM,使用VP8视频,OggVorbis音频
Ogg,使用Theora视频,OggVorbis音频
audio元素支持的音频格式MP3,Wav,Ogg;video元素支持的格式MP4,WebM,Ogg。
在HTML5中audio和video元素提供的接口包含了一系列的属性,方法和事件,这些接口可以帮助开发完成对音频和视频的操作。
那么如何在页面中添加音频和视频呢?
音频
<audio src="resources/audio.mp3">
</audio>
视频
<video src="resources/video.mp4" width="600" height="200">
</video>
因为各种浏览器对音频和视频的编解码器的支持不一样,为了能够在各种浏览器中正常使用,可以提供多个源文件。
<audio src="resources/audio.mp3">
<source src="song.ogg" type="audio/ogg">
<source src="song.mp3" type="audio/mpeg">
</audio>
<video src="resources/video.mp4" width="600" height="200" controls>
<source src="movie.ogg" type="video/ogg codes=`theora,vorbis` ">
<source src="movie.mp4" type="video/mp4">
</video>
使用source元素替代了audio或video的标签属性src。
元素的标签特性
<video src="resources/video.mp4" autoplay></video>
<video src="resources/video.mp4" controls></video>
<video src="resources/video.mp4" controls loop></video>
<video src="resources/video.mp4" controls preload="auto"></video>
<video src="resources/video.mp4" controls poster="images/none.jpg"</video>
<video src="resources/video.mp4" width="600" height="200" controls></video>
接口属性
<!DOCTYPEHTML>
<html>
<head>
<meta charset="utf-8">
<title>视频播放时的快进</title>
<script type="text/javascript">
function Forward() {
var el=document.getElementById("myPlayer");
var time=el.currentTime;
el.currentTime=time+300;
}
</script>
</head>
<body>
<video id="myPlayer" src="resources/video.mp4" width="600" height="200" controls>
</video>
<br/>
<input type="button" value="快进" onclick="Forward()"/>
</body>
</html>
接口方法
代码示例使用接口:
<!DOCTYPEHTML>
<html>
<head>
<meta charset="utf-8">
<title>播放与暂停</title>
<script type="text/javascript">
var videoEl=null;
function Play() {
videoEl.play();
}
function Pause() {
videoEl.pause();
}
window.onload=function(){
videoEl=document..getElementById("myPlayer");
}
</script>
</head>
<body>
<video id="myPlayer" width="600">
<source src="resources/video.mp4" type="video/mp4">
</video><br>
<input type="button" value="播放" onclick="Play()"/>
<input type="button" value="暂停" onclick="Pause()"/>
</body>
</html>
捕获事件的方式
捕获事件有两种方法:一种是添加事件句柄,一种是监听。
<video id="myPlayer" src="resources/video.mp4" width="500" onplay="video_playing()">
</video>
// 监听方式
var videoEl=document.getElementById("myPlayer");
videoEl.addEventListener("play",video_playing);
接口事件
定义全局的视频对象
代码如下:
<script type="text/javascript">
// 定义全局视频对象
var videoEl=null;
// 网页加载完毕后,读取视频对象
window.addEventListener("load", function() {
videoEl=document.getElementById("myPlayer")
});
</script>
添加进度显示功能
代码如下:
<script type="text/javascript">
function Progress() {
var el=document.getElementById("progress");
el.style.width=(videoEl.currentTime/videoEl.duration)*720 + "px"
document.getElementById("info").innerHTML=s2time(videoEl.currentTime) + "/" + s2time(videoEl.duration);
}
function s2time(s) {
var m=parseFloat(s/60).toFixed(0);
s=parseFloat(s%60).toFixed(0);
return (m<10?"0"+m:m)+":"+(s<10?"0"+s:s);
}
window.addEventListener("load",function(){videoEl.addEventListener("timeupdate",Progress)});
window.addEventListener("load",Progress)
添加静音和调节音量的功能
消除静音videoEl.muted=false;静音效果videoEl.muted=true;videoEl.volume=e.value;修改音量的值。
添加慢进和快进功能
*请认真填写需求信息,我们会在24小时内与您取得联系。