TinyPot是一个轻量级播放器。
该播放器的前身是金庸水浒传的片头动画播放子程。在整个游戏过程中该子程仅被调用了一次,但是为了做好这个部分,开发组使用了FFmpeg进行解码,BASS进行播放,SDL2进行输出,并成功将其移植到了其他平台。因此,金庸水浒传的片头实际支持相当多的格式。而大水壶播放器在设计阶段,也是使用类似的架构,但是在开发阶段发现音频难以控制,因此改为了使用SDL2播放。
而水浒的谐音是水壶,同时新论坛叫大武侠,有个“大”字,所以该播放器起名“大水壶”,英文BigPot。至于跟著名的播放器PotPlayer有没有关系,答案是一点都没有,而且PotPlayer的功能远远强于大水壶,名字有点像只是巧合。
另外现在改叫小水壶了……
程序语言是C++,使用FFmpeg进行解码,SDL2硬件输出,还有SDL_image、SDL_ttf等库。字幕部分使用libass,该库又依赖Fontconfig、freetype和fribidi。配置文件使用的是tinyxml2,hash是sha3。
该播放器的架构并未参考其他主流播放器,而是重新设计的单线程预解,原理如下图。在跳转的时候可能会稍慢于其他的主流播放器,但是相差并不明显。
首先需要取得common库。
git clone https://github.com/scarsty/common common
其余依赖库包括iconv,ffmpeg,libass,SDL2,SDL2-image,SDL2-ttf等,推荐使用系统的包管理工具获取这些库,Windows下推荐使用vcpkg。其中SDL2_image仅有一处使用,且并不是必须的,可以简单修改后去除。
Windows下也可以从https://github.com/scarsty/lib-collection取得头文件和导入库。
https://github.com/AutoItConsulting/text-encoding-detect、sha3、tinyxml2,均直接包含代码到工程中。
请使用Visual Studio 2017编译x64版。
32位部分默认编译为dll,可以嵌入其他程序的窗口播放。特别是基于SDL2的游戏,用法非常简单。
推荐使用homebrew安装依赖库。
使用CMake生成Makefile。
脚本a.sh可以自动编译和处理动态库的依赖修正。
与上面方法类似,但是通常不需要打包为app,因此比Mac要简单。
如果需要编译单文件(全静态链接)版,导入库比动态链接版要多出很多,建议使用vcpkg之类解决(vcpkg生成的fribidi静态库不正确,需手动修正)。
以下为参考(fribidi及以下是动态链接不需要的):
sdl2.lib
sdl2_ttf.lib
sdl2_image.lib
sdl2main.lib
ass.lib
libiconv.lib
avutil.lib
avcodec.lib
avformat.lib
swresample.lib
swscale.lib
fribidi.lib
harfbuzz.lib
freetype.lib
bz2.lib
libpng16.lib
zlib.lib
libcharset.lib
winmm.lib
version.lib
imm32.lib
bcrypt.lib
secur32.lib
ws2_32.Lib
若是需要编译dll文件,用于在其他基于SDL2的游戏中播放视频时,则TinyPot和游戏均不应静态链接SDL。因为SDL的动态库中含有全局变量,多次静态链接后该变量会有多个副本,其中一个很可能是不正确的。
因为没有制作配置的图形界面,所以仅能将文件拖到图标或者窗口上进行播放,或者设置为文件类型默认的打开方式。
FFmpeg能解什么格式它就能放什么格式,FFmpeg不能解的,它也放不出来。而且也不考虑调用其他的解码器,因为作者不会。
特别地,不能播放WAV,以及WAV为音频流的视频文件,因为WAV是没有压缩的,谈不上解码。也不推荐用它播放纯音频,因为它的音频没有经过处理,只是把解码的结果原样放出来,远不及专门的播放器。
打开文件的时候,会先判断有没有字幕,有的话会自动载入。或者播放的时候拖一个字幕进去也会载入字幕,而字幕的扩展名必须是ass、ssa、srt、txt其中之一。其他文件都会当成媒体文件处理,能否播放看解码器的。
查找字幕的方式是先依次将媒体文件的扩展名替换为ass、ssa、srt,并在媒体所在目录下以及sub子目录中寻找,即可以将字幕集中放到sub子目录。
按键 | 功能 |
---|---|
方向左右 | 跳过几秒 |
方向上下,鼠标滚轮 | 音量 |
空格 | 暂停 |
回车 | 全屏切换 |
退格 | 回到视频开头 |
Delete | 删除播放记录 |
1 | 切换音频流 |
2 | 切换字幕流 |
3 | 内部字幕显示/隐藏 |
4 | 外部字幕显示/隐藏 |
,(<) | 上一个文件 |
.(>) | 下一个文件 |
0 | 窗口大小调整为视频尺寸 |
- | 减小窗口 |
=(+) | 增大窗口 |
设置 | 功能 |
---|---|
volume | 音量 |
auto_play_recent | 自动播放上次关闭时的文件 |
record_name | 是否记录文件名 |
sys_encode | 系统字串编码 |
ui_font | 显示界面的字体 |
sub_font | 显示字幕的默认字体 |
因为是单线程架构,所以在一些文件跳转时会出现马赛克。一般来说这个可以通过清除解码器状态来解决,但是单线程架构下这个操作会导致后面一帧的解码卡顿,故没有这么做。
通常RM和RMVB,以及从流媒体服务器直接下载的MP4可能有此问题。