注意:本代码仅适用于个人学习交流使用,仅当您出于收藏目的,希望能在拷贝漫画程序以外的地方仍可阅读已下载的漫画时,方可使用本代码及编译的程序。严禁将由本代码或程序得到的图片文件通过任何形式分发、二次上传,由此引发的任何版权、商务、法律纠纷,本代码(程序)及作者不承担任何后果。
拷贝漫画下载后的漫画以webp(VP8)编码的视频流形式存放于后缀名为.copy的文件中,漫画的每一页为视频流中单独一帧,在Android系统中通常存放于“内部存储/Android/data/com.copymanga.app/files/”目录中的一个十六进制字符串加“-”组成的目录下(如“/c7exxxxx-0xxx-1xxx-axxx-06xxxxxxxxxx/”),在此文件夹内每部漫画以单独文件夹的形式存放,其中可见封面缩略图和.copy和.size文件,.copy文件即为所需。
ffmpeg可直接解码该文件中的视频流,也可将其转码后将每帧输出为单独的图片文件。但由于漫画每页的图片大小不同,导致视频流中经常出现帧大小发生变化的情况,而简单的ffmpeg提取指令会以视频流信息中记录的帧大小信息(通常与第一帧的大小相同)作为输出大小参数,导致部分提取出的图片发生较严重的变形。
为解决这一问题,本程序通过ffmpeg输出每帧的信息后获取对应的帧大小信息,在帧提取时使用每帧对应的大小作为输出参数,构建ffmpeg命令,进行输出。
本代码中使用了控制台命令,由于作者并不熟悉除Windows以外的操作系统,不确定对应的命令在其他平台上能否运行,因此建议在Windows平台上运行本代码。封装的.exe可执行文件自然应该在Windows平台上运行。
请保证ffmpeg在系统path路径中且处于可调用状态。若不在path中,也可以将ffmpeg.exe置于与本程序或代码相同的文件夹内(当前工作目录)。ffmpeg可于https://ffmpeg.org/download.html处下载。
使用时将需要提取的.copy文件放到与本程序相同的文件夹(或使用Python执行代码时的工作目录)内,请确保文件夹内有且仅有一个.copy文件,否则程序会报错。运行.exe程序或者使用Python执行.py代码,即可在当前文件夹内输出提取出的图片。
程序运行后会产生一个不自动删除的frame_info.log文件,里面记录了视频流的帧信息;程序若出现异常,会产生一个error.log文件,可查看错误类型。这两个文件均在同一文件夹下。
若程序预计输出的图片数大于501张,将会通过控制台提醒您检查是否为预期结果,并提醒您选择是否继续,通过输入(Y/N)可继续或终止。
虽然本项目本质上就是一个面向GPT的编程,但既然做成了一个小工具,以及考虑到还会有人有相同的需求,因此决定将其发布出来。
本程序基于ffmpeg实现目标功能,但由于作者对于开源协议不熟悉,不知道该如何引用ffmpeg,就把ffmpeg的官网贴这里了(https://ffmpeg.org/),也请需要下载ffmpeg的各位去Usage中提到的网站下载,本项目中就不提供了。
同样由于不熟悉开源协议,虽然本项目创建的时候选择了一个Apache协议,但并不知道如何操作。如果有需要基于本项目进行二次开发或者传播(虽然本项目并没有什么技术含量,自己从头写也很容易),请标注作者及出处(@RaruseReiji, https://github.com/RaruseReiji/Extract_Copymanga.git)。
V1.0.0:完成了基本逻辑,当系统path中存在ffmpeg时,可以在当前文件夹中仅存一个mkv文件时实现逐帧依据各自帧大小进行提取,会输出一个不自动删除的frame_info.log,输出图片为output%04d.png。
V1.0.1:添加了ffmpeg路径判断,当系统path中存在ffmpeg时优先调用path中的ffmpeg,当不存在时查找同文件夹内是否存在ffmpeg.exe,如果存在则使用此程序执行,若不存在则停止运行。
V1.1.0:将ffmpeg帧提取命令中帧定位方法从pts序列号换至-ss {pts_time} -to {frame_info[i + x -1][2] + 0.001}(考虑到部分视频可能出现pts序列号不连续的问题,且帧duration基本都大于0.001s); 增加错误日志输出功能,打印运行时间、错误原因及部分变量; 增加frame_info空值检查; 增加frame_info过长(大于501)检查,过长时提醒用户,由用户决定是否继续提取; 增加视频信息文件读取时可能的错误处理; 增加根据帧数量动态确定输出文件名中的数字位数。
V1.1.1:发现不用更改后缀名也可以正确识别视频流,因此将所有.mkv都修改为了.copy; 减少了错误日志中frame_info的输出长度为前后各10行。