用大电视放电影

很久以前在图书馆工作的时候,同时开几台计算机,每台放着不同的片子,一起看。嗯,测试机器性能和练习软件配置。也许更早就喜欢看电影,不过,是从那时起开始养成看电影这个习惯的吧。当时一起工作的前辈已经多一半退休或即将退休,挺想念他们的。

只看电影,没买电视。所以对有些人担心孩子看电视拦不住难以共情,如果家里没电视当然也就不会有这个问题了。没买电视的原因不是因为钱或者时间,而是因为习惯。从小就不喜欢看直播,对提前半天半年知道哪一队胜了始终也提不起兴趣来。对电影电视剧里隔离出来的人大喊“你别告诉我世界杯结果”不能理解。

这么多年来,仅有三次用到电视。一次是大半夜正准备睡觉,电视开始放《秋日传奇》,我和二猫妈不睡觉又看了一遍。一次是北京申奥成功,我跟图书馆的同事正在角山长城附近玩,大家一起看了直播。一次是中国好声音,有一集看的不是回放。剩下的时间,包括春晚,很早就看一部分的回放,也没有觉得缺什么。

看什么由我选,不喜欢被推送。不少人没事就打开电视收音机,也不看不听,还能干活休息,我完全不能理解。结果就是家里有台大电视,我喜欢看的,它没有;它有的,我觉得是烂片。联网就升级,升一次级挺长时间,除了广告什么也没有更新,除了速度更慢没有什么变化。

看过不少电影和电视剧,用的都是计算机,不是电视。这几年时间紧,电视剧也很少看了,有剧集"在看"了近十年没有完成的。

对,就是时间。吃饭的时候看电影,是个好时间。可以把电影拆了,开始吃饭的时候定倒计时,每次看半小时。但是用计算机看电影对吃饭有影响,需要占点桌子空间,或者接计算机一两分钟。心理学告诉我们,如果你想干什么事,别犹豫,也别创造犹豫的环境,并且要去除导致犹豫一下的可能。所以,要更迅速地能开始看电影才好。

这台电视确实能看电影,它能播放U盘里的MP4。

1. 问题

这台电视播电影有些问题。 (1)兼容性。有些文件能放,有些不能放,系统就显示不能放。可能与格式有关。 (2)卡顿。有些电影放起来动作一格一格的,看十几秒我就快晕车了。通常大文件这种情况更容易出现。我的计算机性能低下 (是的,比很多同学觉得没法干活的机器要慢好几年),播放有些视频也卡。与文件大小不总相关,有的大文件8G、40G的倒是不卡,而2G的也可能卡。 (3)声音。有的电影放的时候没声,在计算机上放就没有问题。 (4)有的电影没有字幕。虽然有时候可以锻炼英语,但是奈何有些片子是日文的,在计算机上有英文字幕,在电视上却是生肉。

2. 解决方案

有相当长一段时间,就是选能看的片子看。能看就看,不能看就不看,或者在计算机上看。

有一天想起了邦哥的话,"你说你一个学计算机的"。他说这话时,我正犹豫给苹果越狱,担心变砖,他重复了这句我们常说的话,给了我勇气。我一个学计算机的,怎么能被一台电视难住。

祭起伟大的影音工具的祖宗 ffmpeg。

(0) 输入输出

实验全部完成以后,做了个bat文件,看起来像这样。

ffmpeg -i %1 ... ... %1.mkv

其中的"... ..."是此刻省略的内容,一会儿解释。

%1 代表bat的第一个命令行参数,这里就是电影的文件名。执行的时候这样:

to_h264.bat from.mkv

会生成一个同名的文件,叫做 from.mkv.mk。加个后缀以示区别。

(1) 格式

有的不能放,有的能放。那么看看能放的都是什么格式,都转成这种格式。h264和mpeg4都行,就用h264了。

参数为 -vcodec h264 。

(2) 压缩,码流,分辨率

大文件不能放的可能性大,很可能跟分辨率和码流有关,把文件整小点就行了吧。尝试几次以后,确定了一组码流的经验值,压成这样播放不卡顿,清晰度和连贯性也感觉无异。

分辨率,刚开始实验了几组,看了几个片子。后来有一天突然想到,怎么这么猪脑子。码流可能没有规范参数,分辨率应该有啊。找了下电视的"关于",确定了支持的分辨率。也不必更高,没用,还得做缩放,可能有锯齿,还费CPU。

参数为 -vf scale=1366:768 -b:v 2000k -bufsize 5000k -maxrate 2500k 。

(3) 声音

不幸的事,各有各的不幸。有的放不出声来,不必关心为什么。幸福的事,都是一样一样的,或者抽象出相同的因素来。只需要看看能放出声来的是什么声音编码器就行了。MP3肯定行吧,一查,果然。

参数为 -acodec mp3 。

(4) 考虑不够周全,修bug

按以上参数,播放了一些电影,没有问题。某天又遇到一个有问题,卡顿。用计算机对比,计算机播放不卡顿。检查生成文件的格式、码流都没有问题。

用 ffprobe 查详细参数,然后用excel与不卡顿的电影对比。

卡顿的两个 Stream #0:0(eng): Video: h264 (High 10), yuv420p10le(tv, bt709, progressive)

不卡顿的 Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, progressive), 1920x1080

bitrate, fps等参数有区别,相差不大。

有意义的区别在于 a. yuv420p10le和yuv420p, b.还见过 h264(high 10) 和 h264(high)。

这些术语超出我知识结构了,查了下资料。

a. 概念 420p

: 420p 10bits little endian

b. 概念 h264 high

: H.264 Baseline profile、Extended profile和Main profile都是针对8位样本

: 数据、4:2:0格式的视频序列,FRExt将其扩展到8~12位样本数据,视频格式可

: 以为4:2:0、4:2:2、 4:4:4,设立了High profile(HP)、High 10

: profile(Hi10P)、High 4:2:2 profile(Hi422P)、High 4:4:4

: profile(Hi444P) 4个profile,这4个profile都以Main profile为基础。

如果不强行指定,应该是沿用了源文件的参数。

参数为 -pix_fmt yuv420p

(5) 总结

to_h264.bat :

ffmpeg -i %1 -vcodec h264 -acodec mp3 -vf scale=1366:768 -b:v 2000k -bufsize 5000k -maxrate 2500k -pix_fmt yuv420p %1.mkv

(6) 字幕

为了减少实验的反复,所以字幕当时制定了几套方案,全都跑一遍出结果,然后批量测试的。

a. 硬字幕,就是以图形图像的方式加在画面上那种。韩国人常这么干?压缩一遍时间巨长。

b. 软字幕。字幕以前可以从射手网下载,后来有一段封了。字幕还可以在迅雷影音这类工具播放的时候从网上匹配,导出成单独的文件。要把字幕嵌入到电影文件中,还要要考虑国别、字符编码等等。我一顿考虑各种可能,做了多组实验。

c. 我还没有固定脚本,二猫发现没有那么麻烦。把迅雷影音导出的字幕和电影文件放在同一个目录下,我的电视就可以自动找到字幕了。

(7) 播放器

电视原带的播放器不行,在开始压缩转换以前,就尝试了安装别的播放器。mx player最好。

(8) 剪切,实验用

测试的时候并不是每次都压一整部片子,那需要的时间太长。压缩通常是0.5倍播放速度到1.5倍播放速度。这样,需要0.5~3小时左右。所以做了个剪切一小段时间的版本。

to_h264_cut.bat :

ffmpeg -ss 00:01:00 -to 00:06:00 -i %1 -vcodec h264 -acodec mp3 -vf scale=1366:768 -b:v 2000k -bufsize 5000k -maxrate 2500k -pix_fmt yuv420p %1.mkv

3. 效果

运行有一段时间了,效果一直不错,感觉可以认为稳定了。

4. 以后的工作

现在电影还是要放在U盘里,每次插入,或者提前拷好。接下来,准备尝试架设流媒体服务器比如SRS,用OBS推流。这样,可以在计算机上实时推流电影,在电视或者手机上看。也可以推流bilibili边吃饭看看网课。卷吧。