我想创建一组由单个图像组成的视频,该视频在整个视频中显示,但每个视频都有不同的音频文件。我可以使用各种工具手动完成,但问题是我有很多音频文件,我无法优化帧速率(稍后会更多)并且需要花费大量时间才能这样做但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 /长度(其中长度是我们从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编程语言有一定的了解。
答案 0 :(得分: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"
)
)