关于将ass特效字幕制作成透明背景视频后导入PR的记事

一、 Mov格式

直接用subtitle.ass生成mov文件,Quicktime格式,透明,速度快(x9.78),只是体积略大

1
ffmpeg -y -f lavfi -i "color=color=black@0.0:size=1920x1080,format=rgba,subtitles=subtitle.ass:alpha=1" -c:v png -t "00:00:59.900" -r 60 -b:v 10M subtitle.mov -stats

Lavf61.3.104 编码,元数据 Lavc61.8.100 png 编码
采用 -r 60 -b:v 10M 时,提示:

1
2
3
[vf#0:0 @ 0000025dad18b600] More than 1000 frames duplicated bitrate=13030.9kbits/s dup=920 drop=0 speed=8.18x
[out#0/mov @ 0000025daced7000] video:90140KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.014917%
frame= 3000 fps=489 q=-0.0 Lsize= 90153KiB time=00:00:50.00 bitrate=14770.7kbits/s dup=1750 drop=0 speed=8.15x

意味着帧率设定高了,输入视频的帧率低于60FPS,导致帧重复。指定高帧率时,FFmpeg会重复帧来匹配输出帧率。
比特率 (-b:v 10M):提示 bitrate=14770.7kbits/s 说明实际编码比特率高于指定的10Mbps,可能是因为输出格式需要更高的比特率来保持质量。
所以,一般情况下,可以不指定这两个参数让它自适应:

1
ffmpeg -y -f lavfi -i "color=color=black@0.0:size=1920x1080,format=rgba,subtitles=subtitle.ass:alpha=1" -c:v png -t "00:00:59.900" subtitle.mov -stats

命令重要参数解读:

  • -f lavfi:使用libavfilter虚拟设备作为输入。

  • -i "color=color=black@0.0:size=1920x1080,format=rgba,subtitles=subtitle.ass:alpha=1"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30

    :创建一个透明背景的虚拟视频流,并叠加字幕。

    - `color=color=black@0.0:size=1920x1080,format=rgba`:生成一个1920x1080分辨率的透明背景(黑色@0.0表示完全透明)。
    - `subtitles=subtitle.ass:alpha=1`:叠加ASS字幕文件`subtitle.ass`。

    - `-c:v png`:使用PNG编码器,将视频编码为PNG格式帧(保留透明度)。每一帧都是一个PNG图像文件,生成透明背景视频,使用RGBA格式保留透明度。

    - `-t "00:00:059.900"`:设置输出视频的持续时间为59秒900毫秒。

    - `subtitle.mov`:输出文件名。

    **输出**:生成一个带有透明背景和字幕的MOV文件,使用PNG编码(无损压缩),文件体积大。



    ## 二、 WebM格式

    Premiere Pro 支持 WebM 格式(通过插件),但遗憾的是,对于这种格式的透明背景(也即 alpha 通道)的支持并不理想。虽然 WebM 可以包含透明信息,但 Premiere Pro 可能无法正确识别和处理这种透明度。

    实测过包括` GoPro Cineform 编码的 QuickTime (.mov)`文件在内的多种编码方式,都折在了透明背景识别这里。

    有[网友在帖子](https://blog.csdn.net/xindoo/article/details/134096967)中试过将数字人的绿色背景抠掉,变成透明背景的方法,但是用Ai-China用同样的`ffmpeg`命令没有成功,背景去不掉。(后来在AE中抠掉,但是字幕锯齿严重,有待进一步研究)



    使用 FFmpeg 命令检查视频的像素格式:

    ```powershell
    ffprobe -v error -select_streams v:0 -show_entries stream=pix_fmt -of default=noprint_wrappers=1:nokey=1 output.webm

如果输出是 yuva420p,则说明视频包含 alpha 通道。而即使包含 alpha 透明通道,PR对于WebM的支持仍然不好,往往在导入PR后发现还是不透明。尽管 WebM 支持 alpha 通道,但 Premiere 可能无法正确解释 WebM 文件中的 alpha 通道。这是一个已知的兼容性问题。尝试不同的输出格式: 对于 Premiere,使用 MOV 容器和 ProRes 4444 编码通常是处理带 alpha 通道视频的最佳选择。

因为.mov文件相对较大,所以Ai-China还曾考虑使用 GoPro Cineform 编码的 QuickTime (.mov) 。这种格式提供了较好的压缩率,同时保持了透明度,并且据称与 Premiere Pro 兼容性很好。但实测下来,也可能是操作不当,还是无法实现导入PR透明背景。

1
ffmpeg -i green_video.mp4 -filter_complex "[0:v]colorkey=0x299530:0.1:0.1[ckout]" -map "[ckout]" -map 0:a -c:v libvpx-vp9 -b:v 2M -c:a libvorbis output.webm

这又是一个实测没能通过的命令。因为此博主的目的是抠掉数字人背后的绿幕背景,与Ai-China的带字幕透明背景视频略有不同。大家可以一试。

其中最关键的参数 -filter_complex "[0:v]colorkey=0x299530:0.1:0.1[ckout]" -map "[ckout]" 其中0x299530 是随便使用的绿幕的RGB值, 具体可以根据你绿幕的RGB值进行调整。 colorkey后面的0.1:0.1为色度相似度(比如可以从 0.1 增加到 0.3),你可以进一步调整这些值。也可以使用 chromakey 滤镜: 尝试使用 chromakey 滤镜替代 colorkey。

三、 使用After Effects抠像制作透明背景

要在After Effects中将带有ASS字幕文件的视频的背景抠掉,制作成透明背景的视频,可以按照以下步骤操作:

步骤一:导入素材

  1. 打开After Effects,创建一个新项目。
  2. 导入你的带有颜色背景字幕的视频文件。

步骤二:使用Keying工具抠掉背景

  1. 将视频拖到时间轴上,创建一个新合成。
  2. 选择视频层,然后在“效果和预设”面板中搜索“Keylight”。
  3. 将“Keylight (1.2)”效果应用到视频层。
  4. 在效果控制面板中,使用吸管工具 (screen color) 点击视频中的颜色背景区域。这将会抠掉颜色背景,留下字幕和透明背景。

步骤三:导出带透明背景的视频

  1. 选择合成窗口,然后点击“文件” > “导出” > “添加到渲染队列”。
  2. 在渲染队列中,点击“输出模块”的“无损”选项,选择“QuickTime”格式。
  3. 确保在格式选项中选择“动画”编解码器,并勾选“Alpha通道”以保持透明背景。
  4. 设置输出路径,然后点击“渲染”。

这样你就可以得到一个带有透明背景的字幕视频文件了。这个视频文件可以在Premiere等其他视频编辑软件中叠加在其他视频之上。

解释关键步骤

  1. Keylight效果:Keylight是一个强大的抠像工具,可以帮助你轻松移除单色背景。
  2. Alpha通道:在导出设置中选择支持RGB+Alpha通道的编解码器,确保视频的透明部分能够正确保留。

你可以根据需要调整Keylight效果的参数,以获得更好的抠像效果。

四、 GPU加速生成

1
ffmpeg -y -f lavfi -i "color=color=black@0.0:size=1920x1080,format=rgba,subtitles=subtitle.ass:alpha=1" -c:v png -t "00:00:59.900" subtitle.mov -stats

这个命令实际上是用CPU生成视频,速度很快,大概正常视频长度的10倍速左右(Ai-China使用的是i5 13代CPU)。但这个CPU占用是很大的,如果想用GPU生成,可以考虑如下命令:

尝试使用NVIDIA或Intel的硬件加速来提高处理速度。以下是一些建议:

  1. 使用NVIDIA GPU加速:

对于NVIDIA GPU,我们可以使用NVENC编码器。但是,NVENC不直接支持PNG编码。我们可以使用H.264HEVC编码,然后再转换为带alpha通道的格式。例如:

1
2
ffmpeg -y -f lavfi -i "color=color=black@0.0:size=1920x1080,format=rgba,subtitles=subtitle.ass:alpha=1" -c:v hevc_nvenc -pix_fmt yuva420p -t "00:00:59.900" subtitle_temp.mp4
ffmpeg -i subtitle_temp.mp4 -c:v prores_ks -profile:v 4444 -pix_fmt yuva444p10le subtitle.mov
  1. 使用Intel QuickSync(集成显卡)加速:

对于Intel集成显卡,我们可以使用QuickSync。同样,我们需要先编码为支持的格式,然后再转换:

1
2
ffmpeg -y -f lavfi -i "color=color=black@0.0:size=1920x1080,format=rgba,subtitles=subtitle.ass:alpha=1" -c:v h264_qsv -pix_fmt yuva420p -t "00:00:59.900" subtitle_temp.mp4
ffmpeg -i subtitle_temp.mp4 -c:v prores_ks -profile:v 4444 -pix_fmt yuva444p10le subtitle.mov
  1. 同时使用NVIDIA和Intel硬件加速:

不幸的是,FFmpeg不能同时使用两种不同的硬件加速。但是,我们可以在处理过程中分别使用它们:

1
2
ffmpeg -y -f lavfi -i "color=color=black@0.0:size=1920x1080,format=rgba,subtitles=subtitle.ass:alpha=1" -c:v hevc_nvenc -pix_fmt yuva420p -t "00:00:59.900" subtitle_temp.mp4
ffmpeg -hwaccel qsv -i subtitle_temp.mp4 -c:v prores_ks -profile:v 4444 -pix_fmt yuva444p10le subtitle.mov

这里,第一个命令使用NVIDIA GPU编码,第二个命令使用Intel QuickSync解码。

注意事项:

  1. 这些命令可能需要根据您的具体硬件和FFmpeg版本进行调整。
  2. 使用硬件加速可能会略微降低视频质量,特别是在处理alpha通道时。
  3. 确保您的FFmpeg版本支持这些硬件加速选项。

但是,又要说但是了!


据Ai-China实测,第四大项GPU加速中的所有命令,尽管也是在生成PR支持最好的、带透明通道的.mov文件,也的确调用了GPU在生成,但是:导入PR后还是背景不透明!

所以,按Ai-China的初心意图,只有最开始的那条命令ffmpeg -y -f lavfi -i "color=color=black@0.0:size=1920x1080,format=rgba,subtitles=subtitle.ass:alpha=1" -c:v png -t "00:00:59.900" subtitle.mov -stats是符合要求的,众位自测。