云压制视频字幕


前言

由于自己有了台Pixel 1,打算把自己喜欢的动漫和电影都通过其转移到Google Photos上,然后使用Google Photos API请求访问;但逆天Google Photos除了其原始APP的下载和Google Takeout之外只能访问转码之后的视频,那些内嵌硬字幕/外挂字幕的就无法成功播放;

而如果全部都丢本地手动内嵌软字幕的话,电费和硬盘感觉很难撑住,幸好有Google Colab

字体安装

由于手动内嵌字幕是需要使用字体的,所以需要安装合适的字体包。acgrip的字体文件并未包含最基本的部分,所以你需要将自己本地的所有字体上传至Google Drive,这样才能使用Google Colab安装并使用适合的字体。

Colab安装字体代码:

import os
import shutil

def copy_fonts(root_folder, target_folder):
    # 更改文件系统权限,使其可写
    #!sudo mount -o remount,rw /

    for root, dirs, files in os.walk(root_folder):
        for file in files:
            if file.lower().endswith(('.ttf', '.ttc', '.otf')):
                font_path = os.path.join(root, file)

                # 复制字体文件到目标文件夹
                shutil.copy(font_path, target_folder)


                # 显示安装进度
                print(f"已安装字体: {file}")

    # 恢复文件系统权限为只读
    #!sudo mount -o remount,ro /

# 替换为实际的字体根目录
root_directory = '/content/drive/MyDrive/ownbackup/我的windows字体/Fonts'
target_directory = '/usr/share/fonts/truetype/'

# 复制字体文件
copy_fonts(root_directory, target_directory)

# 更新字体缓存
!fc-cache -vf

视频源下载

由于在colab上使用原版的libtorrent不知为何(可能是tracker?)速度不佳,所以我选择aria2。而网上的很多都无效了,所以我选择这个版本的脚本

而在某些情况下,我需要手动选择下载内容,而该脚本使用的内网穿透为CF的,国内网络连接性较差,而AriaNG是实时操作反馈,这样在我选择/取消大量文件的时候会对网络有极高的要求,所以连接平台我选择了网页版tracker我是通过AriaNG进行添加的,勉强能用。

需要注意的是,在下载速度极快的情况下,Colab的平台上可能会无法正常连接进对应的项目

字幕上传

看个人想法,我是喜欢把字幕上传至和视频同目录的文件夹,所以之后的代码都是以此为基础设置。找的话随便找,网上字幕组多的很,个人推荐几个特效字幕组:拨雪寻春酷漫404/coolcomic404

Colab压制

在按上述方式上传并在Colab上安装好字体,将视频和字幕上传至合适的位置之后,就可以开始进行压制了。由于免费版只有T4才有GPU,所以只能选他。

挂载Google Drive

from google.colab import drive

drive.mount('/content/drive')

修改并运行ffmpeg命令

import os
import subprocess
# 输入文件夹和输出文件夹
input_folder = "/content/drive/MyDrive/ownbackup/1/"
output_folder = "/content/drive/MyDrive/ownbackup/1/output/"

if not os.path.exists(output_folder):
    os.makedirs(output_folder)

for filename in os.listdir(input_folder):
    if filename.endswith(".mkv"):
        # .ass为默认后缀,.sc.ass或.tc.ass都是一个道理
        subtitle_file = os.path.splitext(filename)[0] + ".sc.ass"
        subtitle_path = os.path.join(input_folder, subtitle_file)

        if os.path.exists(subtitle_path):
            print(f"Found subtitle file: {subtitle_file}")
            output_filename = os.path.join(output_folder, f"{os.path.splitext(filename)[0]}_with_subtitles.mkv")
            # 参数可自改
            cmd = f'ffmpeg -hwaccel nvdec -y -i "{os.path.join(input_folder, filename)}" -c:v hevc_nvenc -preset fast -vf "ass=\'{subtitle_path}\'" -c:a copy "{output_filename}"'
            #os.system(cmd)
            # 使用subprocess.run捕获输出
            process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True)

            # 实时输出ffmpeg的运行情况
            for line in process.stdout:
                print(line.strip())
        else:
            print(f"Not Found subtitle file: {subtitle_file}")

你也可以修改为输出在/content本地目录之后再copy到云端目录也行。

下载转码后的视频并检查

因为使用的是hevc_nvenc编码,所以有些播放器可能播放不了,请自行安装支持。

注意事项

  1. 字体一定一定要全,否则会导致压制视频效果与预期不符。
  2. ColabT4 GPU有使用限制,请不要滥用。
  3. 这是Colab压制脚本的下载链接

文章作者: xieshang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 xieshang !
评论
  目录