我的任务是利用旧的网络幻灯片制作视频。首先,我有 jpeg 和音频文件,它们在旧系统中用作 Flash 幻灯片,结构如下:
音频结构
- my_audio_1.mp3(此文件是 3 秒的静音 mp3)
- 我的音频2.mp3
- 我的音频3.mp3
- my_audio_4 等等...每张幻灯片大约有 30 个 mp3
图像结构
- my_image_1.jpg(作为开场幻灯片)
- 我的图像2.jpg
- 我的图像3.jpg
- my_image_4。等等……每张幻灯片大约 30 张图片。
由于有近 100 个幻灯片需要转换为视频,我使用 PHP 创建了一个基于 Web 的界面来自动化该过程,该界面位于本地系统上,并尝试使用以下方法合并文件shell_exec()。该过程采用以下工作流程:
- 循环播放每张幻灯片并制作 avi 或 mpeg。例如我的迷你视频2.avi是一段包含以下内容的视频我的图像2.jpg并配乐我的音频2.mp3。这张幻灯片将持续我的音频2.mp3。
- 连接/拼接/连接所有迷你视频以创建最终视频(使用以下组合猫并且要么门编码器或者ffmpeg(我也尝试过avimerge但无济于事。
- 将新的“主”视频转码为各种格式,如 flv 等。
我以为这会很简单,而且在很多场合都接近成功,但还是不行。我无法通过第 2 阶段,因为我无法获得完美的“主”视频。我现在已经尝试了 Mencoder、FFMpeg,似乎已经尝试了我能想到的所有组合。问题无论我怎么尝试,音频和视频永远无法同步。
此外,我甚至尝试制作无音频的迷你视频,使用猫和mp3wrap然后将新的长 MP3 指定为音轨,但这总是会产生非常短的文件或严重减慢的文件,并使女声配音听起来像男拳击手!!!
原始文件似乎没有任何问题。
有没有人有过从相同起点成功制作视频的经验?或者有人知道我可能做错了什么?
举个例子:
如果我制作无声迷你视频,并将它们拼接成“temp-master.mpg”,然后将 MP3 合并成单个 MP3,名为“temp-master-audio.mp3”,则音频文件的时长为 09:10,视频文件的时长为 08:35。它们应该相同,音频会显得很慢。
我没有发布代码,因为我已经写了很多很多的组合。
2010 年 3 月 21 日更新
感谢 Michael Steele 对 AviSynth 和 VirtualDub 的推荐(我已经添加了 GScript 插件),我取得了一些进展,这个脚本几乎可以正常工作了。现在唯一的问题是,虽然在这个例子中,4 个迷你视频被按照我的意愿一个接一个地添加,但迷你视频总是同一个(例如视频-4, 视频-4, 视频-4, 视频-4而不是视频-1、视频-2、视频-3、视频-4):
# A nearly functional AVS file
# Set out some basic variables
base_audio = "C:\..."
base_image = "C:\..."
total_slides = 4
LoopThroughFiles(total_slides, base_audio, base_image)
#This is the function for outputting each combination
function AudioNImage(string mp3, string image, float fps)
{
audio = DirectShowSource(mp3)
length = audiolengthF(audio)
rate = Audiorate(audio)
frames = Int((length/rate)*fps)
video = ImageSource(image, end=Int(frames), fps=fps)
return audiodub(video, audio)
}
#Loop through the files to create the full command string
# My audio and image files are in the format of VID0002.jpg and VID0002.mp3
function LoopThroughFiles(int total, string audiopath, string imagepath)
{
GScript("""
cmd = ""
for (i=1, total) {
audio = audiopath + "000" + String(i) + ".mp3"
picture = imagepath + "000" + String(i) + ".jpg"
cmd = cmd + "AudioNImage(audio, picture, 25)"
if (i < total) {
cmd = cmd + "+"
}
}
GEval(cmd)
""")
}
所以这几乎已经完成了,但我只是想找出为什么微视频没有增加?
答案1
您的问题可能是由于源内容的帧速率不同而导致的。请使用 MediaInfo 等应用程序来确定是否是此问题。
建议 #1
我曾成功使用 AviSynth 和 VirtualDub 完成此类任务。Avisynth 根据您编写的脚本创建视频流。它非常适合合并多个小文件,因为您可以设置精确的时间。您可能需要使用众多第三方插件之一来在设定的时间段内显示连续的 .jpg 图像。
一旦您对 AviSynth 制作的内容感到满意,请使用 VirtualDub 将其编码为您想要的任何格式。
建议 #2
分别进行音频和视频拼接,然后在最后一步合并两个流。
- 使用音频编辑器(例如 Audacity)创建一个主 .mp3 或未压缩的 .wav。
- 按照之前的步骤创建幻灯片视频。
- 合并两个流。VirtualDub 可以做到这一点,但对于这么简单的事情来说有点麻烦。我用过 ripbot264。流行的 Handbrake 工具也可能做到这一点。