1

我想创建一堆由单个图像组成的视频,该图像在整个视频中显示,但每个视频都有不同的音频文件。我可以使用各种工具手动完成,但问题是我有很多音频文件,我无法优化帧速率(稍后会详细介绍),这样做需要很多时间,但 ffmpeg 提供我需要的一切,但问题是我不知道如何批处理所有内容。

基本代码:
ffmpeg -i song-name.mp3 -loop 1 -i cover.jpg -r frame-rate -t song-length -acodec copy output.mp4

我想要实现
的目标:假设我有一个文件夹,其中包含几个音频文件:song-name-1.mp3、song-name-2.mp3、...、song-name-n.mp3 和封面。 .jpg

我需要一个批处理文件,它采用文件夹中每个 mp3 文件的名称(我想是一个 FOR 循环)并使用相同的命令处理它:
ffmpeg -i song-name.mp3 -loop 1 -i cover.jpg -r frame-rate -t song-length -acodec copy output.mp4

因此,每个视频的图像始终相同。歌曲长度可以使用工具mp3info和相应的命令获取:
mp3info.exe -p %S song-name.mp3

由于我在整个视频中只有一个图像,因此最佳帧速率将是视频长度的倒数,即 1/长度(其中长度是我们从 mp3info 获得的以秒为单位的变量)。

所以最终的代码应该是这样的:
ffmpeg -i song-name.mp3 -loop 1 -i cover.jpg -r 1/length -t length -acodec copy song-name.mp4

其中“song-name”是一个变量,它会随着 FOR 循环的每次迭代(即文件夹中的每个音频文件)而变化,而 length 是一个变量,我们可以通过以下命令获得其值:
mp3info.exe -p %S song-name.mp3

我找到了一个 FOR 循环的例子来获取特定文件夹中所有 mp3 的所有文件名,但我不知道如何集成 mp3info。我希望有人可以帮助我,如果可以以任何方式使用的话,我对 C 编程语言有一些了解。

4

1 回答 1

2

这是没有 VBS 数学的编辑简化版本。

使用 %%S 的原因是 % 是一个特殊的批处理字符,用于 %environment% 变量和 forINdo 循环,并且要在 forINdo 命令中获得单个字符,它必须加倍。同样echo %%会回显一个百分号。

@echo off
for %%a in (*.mp3) do (
for /f "delims=" %%b in ('mp3info.exe -p %%S "%%a"') do (
ffmpeg -i "%%a" -loop 1 -i "cover.jpg" -r 1 -t %%b -acodec copy "%%~na.mp4"
)
)
于 2013-06-28T09:47:44.423 回答