You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将合成图片音频为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 1
  • tune="stillimage":针对静态图片优化编码效率和质量,对应-tune stillimage
  • acodec="aac", audio_bitrate="192k":指定音频编码格式和比特率,对应-c:a aac -b:a 192k
  • pix_fmt="yuv420p":设置兼容性最广的像素格式,对应-pix_fmt yuv420p
  • shortest=True:强制视频时长与音频一致,避免生成无限长视频,对应-shortest

内容的提问来源于stack exchange,提问作者Ali Herz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:11:27