最近在用数字人简易方案,看到了sadtalker虽然效果差,但是可以作为一个快速方案,没有安装sd的版本,随便找了个一键安装包
设置如上
使用倒是非常简单,但是出现一个问题,就是输出的mp4都出马赛克了
界面上却没有一个可以调节mp4生成质量的地方(并非换脸效果),
先说结论
进入SadTalker\src\utils修改videoio.py
cmd = r'ffmpeg -y -hide_banner -loglevel error -i "%s" -i "%s" -vcodec mpeg4 -crf 24 -b:v 400M "%s"' % (video, audio, temp_file)
添加的就是-crf 24 -b:v 400M 用来提高输出质量
另外一个可有可无的修改地方就是(我也忘记有没有用了)SadTalker\src\facerender里的animate.py
imageio.mimsave(path, result, fps=float(25),codec='libx264', quality=10)
imageio是借助FFmpeg快速读写视频图片
大致就是这两个位置
搜索过程
如果语音时间长了视频效果就更差了,于是进入代码搜索
gen_video = gr.Video(label="视频输出", format="mov").style(width=256)
里面就gr就是gradio是一个界面库,没有什么可改的,改进去就变成改别人的库了
进入src看看gradio_demo.py这个最大的文件
里面看到cmd = r"ffmpeg -y -hide_banner -loglevel error -i %s %s"表示有视频处理的东西
随后进入src.facerender.animate找到imageio.mimsave处理过程,但是光是改这个并没有用,测试了很多次
突然发现关键一句
save_video_with_watermark(path, new_audio_path, av_path, watermark= False)
这个注释掉了就报错了,然后发现save_video_with_watermark这个方法会在视频生成后,继续对生成的视频处理,然后生成一个低质量的覆盖原始文件,虽然报错,但是能输出一个未压缩的正常mp4文件,但是也没有音频合进去
然后通过from src.utils.videoio import save_video_with_watermark找到了videoio文件,主要是用来合成水印和音频的,水印是默认不开的,但是这个转换过程会降低视频质量
原句r'ffmpeg -y -hide_banner -loglevel error -i "%s" -i "%s" -vcodec mpeg4 "%s"'作用
问了gpt以后
这个命令是一个使用 ffmpeg (一种广泛使用的多媒体处理工具)的命令行字符串,用于将两个输入文件转换并编码为一个输出文件。让我们逐部分来解释这个命令:ffmpeg:这是命令的开始,调用 ffmpeg 程序。
-y:这个选项表示自动覆盖输出文件。如果没有这个选项,当输出文件已经存在时,ffmpeg 会询问是否覆盖。
-hide_banner:这个选项用来隐藏启动时的版权和版本信息等输出。这使得输出更加清晰,只显示重要的信息。
-loglevel error:这个选项设置日志的级别。error 表示只有错误信息会被打印出来,这有助于减少不必要的日志输出。
-i "%s":-i 代表输入文件。"%s" 是一个占位符,将在命令执行时被具体的文件路径替换。由于这个占位符出现了两次,这意味着命令将接收两个输入文件。
-vcodec mpeg4:-vcodec 指定了视频编解码器。在这里,它设置为使用 mpeg4 编解码器进行视频编码。
"%s":这是第三个占位符,代表输出文件。当命令执行时,它会被输出文件的路径替换。