我想创建一组由单个图像组成的视频,这是整个视频显示,但每个视频都有一个不同的音频文件。我可以用各种工具手动完成,但问题是我有很多音频文件,我不能优化帧率(后面会有更多),这样做需要很多时间,但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和cover.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/length (其中length是我们从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编程语言有一定的了解,如果C编程语言可以以任何方式使用的话。
发布于 2013-06-28 17:47:44
这是经过编辑的简化版本,没有VBS数学。
使用%%S的原因是,%是一个特殊的批处理字符,用于%environment% variables和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"
)
)https://stackoverflow.com/questions/17352149
复制相似问题