用moviepy合并多条视频出现杂音的问题

问题复盘:

1、多条视频均为用MP3文件与图片生成的小片段MP4,这些片段没有任何杂音

2、用moviepy合并这些片段后,在衔接处出现杂音

探索解决方案:

1、有人说是MP3压缩的问题

尝试修改所有声音文件为wav,合并依然存在杂音

2、在GitHub,有人提出类似的问题

https://github.com/Zulko/moviepy/issues/1936

“MoviePy adds sound artifact to the end of the audio file after reading it #1936 ”

有个人提出,用新的ffmpeg版本,6替代4

于是,在地址:

Builds - CODEX FFMPEG @ gyan.dev

下载了7.1版本,解压安装后,将环境变量的PATH中,修改原路径,改为新的路径,重新生成视频进行试验

结果:仍然有杂音,但感觉减少了很多

------------------------------------ 10.23新发现补充

如果您在尝试拼接视频剪辑时遇到奇怪的音频伪影,这可能是由于音频轨道在拼接点没有正确对齐或者音频编码问题导致的。

音频伪影可能表现为点击声、噼啪声、静音间隙或其他异常声音,通常发生在视频剪辑的拼接处。要解决这个问题,您可以尝试以下几种方法:

  1. 确保音频同步:在拼接视频时,确保音频轨道在拼接点是同步的。这可能需要您在拼接前对音频进行微调。

  2. 使用过渡效果:在视频剪辑之间添加短暂的过渡效果,如淡入淡出,这可以帮助掩盖拼接点的不连续性。

  3. 调整音频级别:在拼接点前后调整音频级别,避免突然的音量变化。

  4. 重新编码音频:有时候,重新编码音频轨道可以解决伪影问题。确保使用兼容的音频格式和编码设置。

  5. 使用专业软件:使用专业的视频编辑软件,如Adobe Premiere Pro或Final Cut Pro,它们提供了更高级的音频处理工具来避免伪影。

原来上面所谓的杂音,叫做“音频伪影”,audio artifacts when combining clips

------------------------------------ 10.24新发现补充

问题终于完美解决,而且效率还提高了不少

在解决音频伪影问题过程中,采用静音增强、DC处理,都无法解决问题,甚至毫无相关性

终于在一个角落找到一个解决方案:

https://github.com/the-innovation-squad/content-renderer/pull/13/commits/27dbd9d911b4daf6048b1c893681963fe9200778

这个人直接回复:因为使用moviepy合成,会导致伪影,见原话:

# Here we use ffmpeg command line directly, because moviepy's concatenate_videoclips method creates audio artifacts when combining clips

所以,他的解决方案,直接用ffmpeg命令行!

于是写了函数如下:

def concatenate_segments(segment_paths, output_path):

    # Here we use ffmpeg command line directly, because moviepy's concatenate_videoclips method creates audio artifacts when combining clips

    with open('clip_paths.txt', 'w',encoding='gbk') as file:
        for path in segment_paths:
            file.write(f"file 'output/{path}'\n")
    ffmpeg_command = [
        "ffmpeg",
        "-f", "concat",
        "-safe", "0",
        "-i", "clip_paths.txt",
        "-c", "copy",
        output_path
    ]
    #result = subprocess.run(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    result = subprocess.run(ffmpeg_command,input=b'y\n')
    if result.returncode != 0:
        raise Exception(f"Video concatenation failed. Error: {result.stderr}")

这里主要注意几个地方:

1、文件编码,中文显示乱码,容易出错,记得在保存目录文件时,设置gbk的编码

2、文件内的格式,因为处理文件数比较多,用字符串处理不过来,存在文件内,那就得按照他的格式要求来

3、在需要覆盖提示的时候,需要界面输入一个y,这里直接在run方法中,加入一个input=b'y\n'

纠结了几个礼拜的问题,终于得到解决,thx god!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值