基于C++的轻量级播放器

资源下载地址:https://download.csdn.net/download/sheziqiong/88483389
资源下载地址:https://download.csdn.net/download/sheziqiong/88483389

轻量级播放器

简介

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,均直接包含代码到工程中。

Windows

请使用 Visual Studio 2017 编译 x64 版。

32 位部分默认编译为 dll,可以嵌入其他程序的窗口播放。特别是基于 SDL2 的游戏,用法非常简单。

Macosx

推荐使用 homebrew 安装依赖库。

使用 CMake 生成 Makefile。

脚本 a.sh 可以自动编译和处理动态库的依赖修正。

Linux

与上面方法类似,但是通常不需要打包为 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切换字幕流
,(<)上一个文件
.(>)下一个文件
0窗口大小调整为视频尺寸
-减小窗口
=(+)增大窗口

XML 中的设置

设置功能
volume音量
auto_play_recent自动播放上次关闭时的文件
record_name是否记录文件名
sys_encode系统字串编码
ui_font显示界面的字体
sub_font显示字幕的默认字体

遗留问题

因为是单线程架构,所以在一些文件跳转时会出现马赛克。一般来说这个可以通过清除解码器状态来解决,但是单线程架构下这个操作会导致后面一帧的解码卡顿,故没有这么做。

通常 RM 和 RMVB,以及从流媒体服务器直接下载的 MP4 可能有此问题。

预编译版下载

https://github.com/scarsty/tinypot/releases/tag/download

播放效果


资源下载地址:https://download.csdn.net/download/sheziqiong/88483389
资源下载地址:https://download.csdn.net/download/sheziqiong/88483389

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值