青

一言

用 ffmpeg 将 webm 转为 webp 格式

用 ffmpeg 将 webm 转为 webp 格式

用 ffmpeg 将 webm 转为 webp 格式

在此之前已多次通过 ffmpeg 将 webm 转为 webp 格式,但是使用频率非常低,但总会有需求,ffmpeg 的参数多且复杂,使用时总是要复习文档。
故有了本文,方便后续需要时查阅。

注:下面内容经过或来源于生成式人工智能。


WebM 和 WebP 都是 Google 推出的面向网页的媒体格式。WebM 主要用于视频,而 WebP 则用于图像。

出于各种原因,获取到的动图可能是WebM格式的,所以需要将 WebM 视频转换为 WebP 动图。

单个文件转换

假设要将当前目录下的 input.webm 文件转为 output.webp,可以运行:

1
ffmpeg -i input.webm -vcodec libwebp -filter:v fps=fps=20 -lossless 0 -compression_level 3 -q:v 70 -loop 1 -preset picture -an -vsync 0 output.webp

相关参数说明:

  • -i 指定输入文件
  • -vcodec libwebp 指定使用 WebP 编码器
  • -filter:v fps=fps=20 输出20帧每秒
  • -lossless 0 有损压缩
  • -compression_level 3 压缩等级为 3
  • -q:v 70 视频质量参数,0 最差 100 最好
  • -loop 1 让 WebP 循环播放
  • -preset picture 适合图像的编码预设
  • -an 禁掉音频
  • -vsync 0 不同步视频时间戳,加快编码速度

根据实际情况可以调整上述参数。

批量转换

如果要批量转换目录下的 webm 文件为 webp,可以写一个简单的 bash 脚本:

1
2
3
4
#!/bin/bash
for file in *.webm; do
ffmpeg -i "$file" -vcodec libwebp -filter:v fps=fps=20 -lossless 0 -compression_level 3 -q:v 70 -loop 1 -preset picture -an -vsync 0 "${file%.webm}.webp"
done

该脚本遍历当前目录的 webm 文件,逐个调用 ffmpeg 进行转换,输出文件名将 .webm 后缀改为 .webp

进一步优化

可以使用 ffmpeg 的两个衍生项目 ff-webp 和 ffmpeg-webp 进一步优化编码体验。

比如使用 ffwebp:

1
ffwebp -frame_rate 20 -loop 0 input.webm -q 80 -o output.webp

可能得到更小的文件体积。

上述主要内容来源于AI生成,经过我个人的修改和补充。在实际使用过程中,WebM 视频会存在较多的噪点色带,需要获得好的效果,我更喜欢这么处理:

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
31
32
33
34
35
36
37
import vapoursynth as vs
from vapoursynth import core
import havsfunc as haf
import mvsfunc as mvf
from vsdehalo import fine_dehalo
from vapoursynth import YUV444P16, YUV
from vsutil import get_y, scale_value
import functools


def aa_process_eedi2(clip):
w = clip.width
h = clip.height
aa_clip = core.std.ShufflePlanes(clip, 0, vs.GRAY)
aa_clip = core.eedi2cuda.EEDI2(aa_clip, field=1, mthresh=10, lthresh=20, vthresh=20, maxd=24, nt=50)
aa_clip = core.fmtc.resample(aa_clip, w, h, 0, -0.5).std.Transpose()
aa_clip = core.eedi2cuda.EEDI2(aa_clip, field=1, mthresh=10, lthresh=20, vthresh=20, maxd=24, nt=50)
aa_clip = core.fmtc.resample(aa_clip, h, w, 0, -0.5).std.Transpose()
aaed = core.std.ShufflePlanes([aa_clip, clip], [0, 1, 2], vs.YUV)
aaed = core.rgvs.Repair(aaed, clip, 2)
return aaed

src16 = core.ffms2.Source(source='39159145.webm').fmtc.bitdepth(bits=16)

# 降点噪
fft3ed = core.fft3dfilter.FFT3DFilter(clip=src16, sigma=2.0, beta=1, planes=[0,1], bt=3, bw=16, bh=16, ow=4, oh=4,sharpen=0,dehalo=0,ncpu=core.num_threads)
# 降块状噪声
knlmed = core.knlm.KNLMeansCL(fft3ed, d=1, a=2, s=4, h=1.8, device_type='gpu')
# 抗锯齿
aaed = aa_process_eedi2(knlmed)
# 锐化
shaped = core.warp.AWarpSharp2(aaed, thresh=128, blur=4, type=0, depth=[8, 4, 4], chroma=0, cplace="mpeg1")
# dehalo
dhed = fine_dehalo(shaped)
res = mvf.Depth(dhed, 8, dither=0, ampo=1.5, ampn=0.5)

res.set_output()

然后进行处理

1
2
vspipe.exe -c y4m .\webm.vpy output.y4m
./ffmpeg -i output.y4m -vcodec libwebp -filter:v fps=fps=30 -q:v 50 -loop 0 -preset default -an -vsync 0 output.webp

本文作者:
本文链接:https://tdh6.top/%E6%9D%82%E9%A1%B9/webm2webp/
版权声明:本站文章采用 CC BY-NC-SA 3.0 CN 协议进行许可,翻译文章遵循原文协议。
图片来源:本站部分图像来源于网络,前往查看 相关说明。