4

我正在尝试将 mp3 音频文件添加到我使用 MoviePy 使用图像创建的视频剪辑中。当脚本运行时,它会创建 mp4 文件并成功播放,但是没有音频。我不太确定为什么,而且通常似乎找不到大量关于此的文档。MoviePy 对我来说很新,所以任何帮助将不胜感激 - 谢谢!

def make_video(images):
    image_clips = []
    for img in images:
        if not os.path.exists(img):
            raise FileNotFoundError(img)
        ic = ImageClip(img).set_duration(3)
        image_clips.append(ic)

    video = concatenate(image_clips, method="compose")
    video.set_audio(AudioFileClip("audio.mp3")) 
    video.write_videofile("mp4_with_audio.mp4", fps=60, codec="mpeg4")
4

5 回答 5

11

诚然,这个问题很老,但在该问题的搜索结果中排名很高。我有同样的问题,并认为可以澄清解决方案。

该行:

video.set_audio(AudioFileClip("audio.mp3")) 

实际上并没有改变“视频”对象的音轨,而是返回一个附加了新的 AudioFileClip 的对象的副本。

这意味着该方法:

video.write_videofile("mp4_with_audio.mp4", fps=60, codec="mpeg4")

不会用新的音轨写入最终文件,因为“视频”对象保持不变。

按照以下更改脚本为我解决了这个问题。

video_with_new_audio = video.set_audio(AudioFileClip("audio.mp3")) 
video_with_new_audio.write_videofile("mp4_with_audio.mp4", fps=60, codec="mpeg4")

另请参阅文档

于 2018-04-24T17:40:12.163 回答
8

这对我有用:

clip.write_videofile(out_path, 
                     codec='libx264', 
                     audio_codec='aac', 
                     temp_audiofile='temp-audio.m4a', 
                     remove_temp=True
                     )

在这里找到它:https ://github.com/Zulko/moviepy/issues/51

于 2018-12-06T08:08:49.243 回答
4

使用VLC 媒体播放器检查视频 mp4_with_audio.mp4 ,我也有与快速播放器相同的问题。

于 2016-11-14T14:03:49.383 回答
1

我也遇到这个问题。我找到了解决办法,试试

video = video.set_audio(AudioFileClip("audio.mp3"))
于 2016-11-21T19:09:43.203 回答
1

我正在做类似的事情,发现moviepy 1.0.1没有使用正确的参数调用ffmpeg来组合mp4视频的视频和音频。我通过直接使用 ffmpeg 的解决方法解决了这个问题。它使用来自moviepy的临时音频文件和视频文件来创建最终文件。这是一个类似的问题:Output video has no sound 由于您使用的是 mp3,您可能需要将 ffmpeg 转换为 aac,所以这段代码就是这样做的。

此链接帮助我使用 ffmpeg:https://superuser.com/questions/277642/how-to-merge-audio-and-video-file-in-ffmpeg

video_with_new_audio = video.set_audio(AudioFileClip("audio.mp3")) 
video_with_new_audio.write_videofile("temp_moviepy.mp4", temp_audiofile="tempaudio.m4a",codec="libx264",remove_temp=False,audio_codec='aac')

import subprocess as sp

command = ['ffmpeg',
           '-y', #approve output file overwite
           '-i', "temp_moviepy.mp4",
           '-i', "tempaudio.m4a",
           '-c:v', 'copy',
           '-c:a', 'aac', #to convert mp3 to aac
           '-shortest', 
           "mp4_with_audio.mp4" ]

with open(ffmpeg_log, 'w') as f:
    process = sp.Popen(command, stderr=f)
于 2020-07-19T13:15:45.103 回答