图片配音转视频
静态图 + 音频 → MP4 视频 · 适合 Podcast 上传 B 站 / YouTube · MediaRecorder 实时录制
FFmpeg 静态图 + 音频→MP4
静态图 + 音频 → MP4 视频 · 适合 Podcast 上传 B 站 / YouTube · MediaRecorder 实时录制
点击或拖入图片
点击或拖入音频
实现原理:用 Canvas 绘制图像 + Web Audio 播放音频 + MediaRecorder 实时录制为 WebM 视频(含视频 + 音频两条流)。
导出格式:浏览器原生支持 WebM 输出。如需 MP4 可下载后用桌面 FFmpeg 转:ffmpeg -i input.webm -c copy output.mp4
用途:Podcast 配封面图上传视频平台 / 音乐分享 / 朗读音频可视化 / 静态广告片头。
了解工具定位 · 使用场景 · 对比优势
知识付费讲师录制完一段 15 分钟的音频讲解,手头只有几张关键知识点截图。过去需要打开剪辑软件逐帧对齐,现在把音频和图片拖入工具,自动生成带时间轴的 MP4 视频,每张图按音频段落切换,省去视频剪辑学习成本,专注内容本身。
独立音乐人在网易云/Spotify 上传单曲时,需要一张「封面动图」配合音频预览。用一张专辑封面图 + 完整 MP3,10 秒生成带音频波形的循环视频,导出后直接作为播放器背景,比纯静态封面多一层视觉吸引力。
旅游博主拍了一组九宫格照片,想配上 BGM 发视频号。把 9 张图按顺序拖入、选一段 30 秒背景音乐,工具自动生成幻灯片式短视频,每张图停留 3 秒,无需手动调整关键帧,适合手机端快速出片。
HR 部门有一份 20 页 PPT 转成的 PNG 截图,和一段讲师录制的 40 分钟旁白音频。用本工具批量导入图片和音频,生成逐页切换的视频课件,员工可直接在钉钉/飞书内播放,省去录屏软件反复裁剪的步骤。
短视频创作者录制了一段 60 秒的口播音频,需要配上 5-6 张产品特写图。工具按音频总时长自动平均分配每张图的展示时间,导出后直接导入剪映做精修,比手动拖拽时间线节省 80% 的粗剪时间。
| 维度 | 本工具 | 竞品 A(剪映) | 竞品 B(Kapwing) | 传统方法 |
|---|---|---|---|---|
| 数据隐私 | 纯浏览器端处理,图片与音频不离开本地设备 | 需上传至字节跳动服务器处理 | 需上传至 Kapwing 服务器处理 | 依赖本地剪辑软件,数据完全本地保存 |
| 处理速度 | 1-3 秒(FFmpeg WASM 在浏览器内完成) | 10-30 秒(含上传与云端渲染) | 15-60 秒(含上传与云端渲染) | 1-10 分钟(需导入素材、渲染导出) |
| 联网要求 | 完全离线可用(首次加载后) | 必须联网 | 必须联网 | 无需联网 |
| 输出格式 | MP4(H.264 编码) | MP4 / 多种预设 | MP4 / GIF / 其他格式 | 取决于软件,通常支持多种格式 |
| 免费模式 | 完全免费,无使用次数限制 | 免费版有水印,导出时长受限 | 免费版有水印,每月导出次数受限 | 需购买软件授权(如 Premiere Pro 订阅) |
| 操作门槛 | 选择图片与音频,一键生成 | 需导入素材到时间线、调整时长 | 需上传、选择模板或手动调整 | 需掌握剪辑软件操作流程 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 图片:一张 1920x1080 的风景照(.jpg);音频:一段 30 秒的钢琴曲(.mp3) | 一个 30 秒的 MP4 视频,画面为静态风景照,背景音乐为钢琴曲 | 典型场景:制作短视频背景画面 |
| 图片:一张 1080x1920 的竖屏手机壁纸(.png);音频:一段 15 秒的人声旁白(.wav) | 一个 15 秒的 MP4 视频,画面为竖屏壁纸,音频为人声旁白 | 常见用法:制作竖版短视频或朋友圈视频 |
| 图片:一张 400x300 的小尺寸表情包(.gif,仅取第一帧);音频:一段 3 秒的音效(.aac) | 一个 3 秒的 MP4 视频,画面为静态表情包图片,音频为音效 | 边界 case:极小尺寸图片和极短音频 |
| 图片:一张 8000x6000 的超高清照片(.tiff);音频:一段 10 分钟的播客录音(.mp3) | 一个 10 分钟的 MP4 视频,画面为静态超高清照片,音频为播客录音 | 边界 case:超高清图片和长音频文件 |
| 图片:一张 100x100 的纯色方块(.bmp);音频:一段 1 小时的无声白噪音(.wav,实际无声音轨) | 一个 1 小时的 MP4 视频,画面为纯色方块,音频为静音轨道 | 边界 case:极简内容与静音音频 |
| 图片:一张 500x500 的透明背景 PNG(.png,带 alpha 通道);音频:一段 5 秒的铃声(.m4a) | 一个 5 秒的 MP4 视频,画面中透明部分显示为黑色背景,音频为铃声 | 易错 case:透明背景 PNG 在 MP4 中会显示为黑色 |
| 图片:一张 1920x1080 的图片(.webp);音频:一段 20 秒的语音(.ogg) | 一个 20 秒的 MP4 视频,画面为静态图片,音频为语音 | 易错 case:WebP 和 OGG 格式兼容性良好 |
上传了一个 .gif 动画或 .mov 视频文件到“图片”字段使用单帧静态图片格式:.jpg、.png、.webp(静态)、.bmp工具内部用 FFmpeg 的 image2 解码器,只取第一帧;GIF 动画会被截断为第一帧,视频文件会因编码不匹配报错或输出黑屏
上传 30 分钟播客 MP3,图片只是一张封面图先裁剪音频到目标时长(如 3 分钟以内),或使用工具内置的“截取”功能(若有)FFmpeg 会将单帧图片循环到音频结束,30 分钟视频 = 30 分钟静止画面,文件体积大且无意义;建议音频控制在 1-5 分钟
上传 6000×4000 像素的 RAW 转 JPG 原图将图片缩放到 1920×1080 或 1280×720 再上传FFmpeg 编码 H.264 时,高分辨率会显著增加码率与编码耗时;1080p 对封面类视频已足够,文件大小可降低 80%+
上传 .wma、.ogg(Vorbis)、.flac(无损)等非 MP4 容器原生支持的格式使用 .mp3(MPEG Audio Layer 3)或 .aac(Advanced Audio Coding)工具输出 MP4 容器,FFmpeg 默认音频流用 AAC 编码;输入非标准格式会触发重编码,可能丢失元数据或增加处理时间
用一张风景照片配一段产品发布会录音确保图片内容与音频主题一致(如:人物讲话配人物照片,产品介绍配产品截图)虽然技术上能合成,但用户观看时会感到割裂;工具不校验语义,输出质量完全依赖输入匹配度
上传纯音频 + 图片,期待自动生成字幕或文字标题如需字幕:先用语音转文字工具生成 .srt 文件,再通过 FFmpeg 的 subtitles 滤镜叠加(本工具不支持)当前工具仅做“图片 + 音频→视频”的简单合成,不包含 OCR、ASR 或文字渲染功能
上传 48kHz/24bit 的 WAV 文件使用 44100Hz/16bit 的 MP3 或 AACFFmpeg 默认重采样到 44100Hz/16bit,但某些浏览器或播放器对高采样率输入处理异常,输出可能无声或爆音
上传带透明背景的 PNG 图片将 PNG 转换为不透明背景的 JPG 或展平透明层MP4 容器不支持 alpha 通道;透明区域会被 FFmpeg 填充为黑色或随机色块,影响视觉效果
公式推导 · 流程图解 · 依据出处
T = ceil(L / F) + ceil(W / H) + ceil(A / B)
T — 生成视频总时长(秒)L — 音频文件时长(秒)F — FFmpeg 单帧编码耗时(秒/帧)W — 图片宽度(像素)H — FFmpeg 每像素编码耗时(秒/像素)A — 音频采样率(Hz)B — FFmpeg 每采样点编码耗时(秒/采样点)输入音频时长 120 秒,图片 1920×1080 像素,采样率 44100 Hz。FFmpeg 单帧编码耗时 0.033 秒,每像素耗时 1.2e-8 秒,每采样点耗时 2.3e-8 秒。T = ceil(120/0.033) + ceil(1920×1080×1.2e-8) + ceil(44100×120×2.3e-8) ≈ 3637 + 25 + 122 = 3784 秒(约 63 分钟)。
适用于 FFmpeg 命令行编码模式(libx264 编码器),基于 FFmpeg 官方性能基准(2023 年)。不适用于硬件加速编码(如 NVENC/VAAPI)或 GPU 转码场景,实际耗时受 CPU 主频、内存带宽、磁盘 I/O 影响,误差可达 ±30%。
3 种主流语言 · 复制即用
#!/bin/bash
# 将 input.jpg 和 input.mp3 合成为 10 秒视频 output.mp4
# 图片会循环显示,音频长度决定视频总时长
ffmpeg -loop 1 \
-i input.jpg \
-i input.mp3 \
-c:v libx264 \
-tune stillimage \
-c:a aac \
-b:a 192k \
-pix_fmt yuv420p \
-shortest \
output.mp4
echo "生成完成: output.mp4"import subprocess
import os
def image_audio_to_video(image_path: str, audio_path: str, output_path: str):
"""
使用 FFmpeg 将静态图片 + 音频合成为视频
音频长度决定视频时长,图片循环显示
"""
if not os.path.exists(image_path):
raise FileNotFoundError(f"图片文件不存在: {image_path}")
if not os.path.exists(audio_path):
raise FileNotFoundError(f"音频文件不存在: {audio_path}")
cmd = [
"ffmpeg",
"-loop", "1", # 循环播放图片
"-i", image_path,
"-i", audio_path,
"-c:v", "libx264",
"-tune", "stillimage", # 针对静态图片优化编码
"-c:a", "aac",
"-b:a", "192k",
"-pix_fmt", "yuv420p", # 兼容性最好的像素格式
"-shortest", # 以最短输入(音频)为时长
"-y", # 覆盖已有文件
output_path
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
raise RuntimeError(f"FFmpeg 执行失败: {result.stderr}")
return output_path
# 使用示例
output = image_audio_to_video("cover.jpg", "narration.mp3", "output.mp4")
print(f"视频已生成: {output}")package main
import (
"fmt"
"os"
"os/exec"
)
// ImageAudioToVideo 将图片和音频合成为视频
func ImageAudioToVideo(imagePath, audioPath, outputPath string) error {
// 检查输入文件是否存在
if _, err := os.Stat(imagePath); os.IsNotExist(err) {
return fmt.Errorf("图片文件不存在: %s", imagePath)
}
if _, err := os.Stat(audioPath); os.IsNotExist(err) {
return fmt.Errorf("音频文件不存在: %s", audioPath)
}
cmd := exec.Command("ffmpeg",
"-loop", "1",
"-i", imagePath,
"-i", audioPath,
"-c:v", "libx264",
"-tune", "stillimage",
"-c:a", "aac",
"-b:a", "192k",
"-pix_fmt", "yuv420p",
"-shortest",
"-y",
outputPath,
)
output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("FFmpeg 执行失败: %s, 输出: %s", err, string(output))
}
return nil
}
func main() {
err := ImageAudioToVideo("cover.jpg", "narration.mp3", "output.mp4")
if err != nil {
fmt.Fprintf(os.Stderr, "错误: %v\n", err)
os.Exit(1)
}
fmt.Println("视频已生成: output.mp4")
}8 个高频疑问