我正在尝试将一个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")
这对我有效:
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
诚然,这个问题很老,但在问题的搜索结果中排名靠前。我也有同样的问题,认为解决方案可以澄清。
线路:
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")
另请参阅文档
使用VLC媒体播放器检查视频mp4_with_audio.mp4,我也有快速播放器的相同问题。
我也遇到了这个问题。我找到了一个解决方案,试试
video = video.set_audio(AudioFileClip("audio.mp3"))
我也在做类似的事情,发现moviepy 1.0.1没有用正确的参数调用ffmpeg来组合mp4视频的视频和音频。我直接使用ffmpeg解决了这个问题。它使用moviepy中的临时音频文件和视频文件来创建最终文件。这是一个类似的问题:输出视频没有声音由于您使用的是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)
使用此:
video.write_videofile("output.mp4", fps=30, audio_codec="aac", audio_bitrate="192k")
video_clip.audio = AudioFileClip(audio_path)
video_clip.write_videofile("output_video.mp4")
这对我有效