如何将合成图片音频为MP4的FFmpeg命令转为可用Python代码?
问题
需要将图片与音频文件合成并转换为MP4格式,已验证以下FFmpeg命令可正常运行:
ffmpeg -loop 1 -i 01_Prologue.png -i 01_Prologue.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p -shortest out.mp4
但使用Python的ffmpeg库实现批量处理时,以下代码生成了空白视频:
import ffmpeg input_still = ffmpeg.input("image.jpg") input_audio = ffmpeg.input("audio.wav") ( ffmpeg .concat(input_still, input_audio, v=1, a=1) .output("output.mp4") .run(overwrite_output=True) )
需要修正代码以匹配原FFmpeg命令的效果。
解决方案
问题出在误用了concat方法——concat用于拼接多个媒体流,而这里需要让单帧图片循环播放至音频结束,同时完整匹配原命令的编码、调优等参数。
单组文件处理的正确代码
import ffmpeg # 读取输入文件,给图片添加循环参数(对应原命令的-loop 1) input_img = ffmpeg.input("image.jpg", loop=1) input_audio = ffmpeg.input("audio.wav") # 合并流并设置输出参数,完全对应原FFmpeg命令 ( ffmpeg .output( input_img, input_audio, "output.mp4", vcodec="libx264", tune="stillimage", acodec="aac", audio_bitrate="192k", pix_fmt="yuv420p", shortest=True, # 视频时长跟随音频,对应原命令的-shortest overwrite_output=True ) .run() )
批量处理示例
如果要批量处理多组同名前缀的图片和音频(如01_xxx.png和01_xxx.wav),可以通过遍历文件对实现:
import ffmpeg import glob # 按文件名排序,保证图片和音频一一对应 image_files = sorted(glob.glob("*.png")) audio_files = sorted(glob.glob("*.wav")) for img_path, audio_path in zip(image_files, audio_files): output_path = f"{img_path.rsplit('.', 1)[0]}.mp4" input_img = ffmpeg.input(img_path, loop=1) input_audio = ffmpeg.input(audio_path) ( ffmpeg .output( input_img, input_audio, output_path, vcodec="libx264", tune="stillimage", acodec="aac", audio_bitrate="192k", pix_fmt="yuv420p", shortest=True, overwrite_output=True ) .run(quiet=True) # 减少控制台冗余输出 ) print(f"已生成:{output_path}")
参数对应说明
每个代码参数完全映射原FFmpeg命令的功能:
loop=1:让单帧图片循环播放,对应-loop 1tune="stillimage":针对静态图片优化编码效率和质量,对应-tune stillimageacodec="aac", audio_bitrate="192k":指定音频编码格式和比特率,对应-c:a aac -b:a 192kpix_fmt="yuv420p":设置兼容性最广的像素格式,对应-pix_fmt yuv420pshortest=True:强制视频时长与音频一致,避免生成无限长视频,对应-shortest
内容的提问来源于stack exchange,提问作者Ali Herz
相关产品推荐
相关产品推荐

