成功连接多个视频

6 slideshow concatenation video-editing

我的任务是用旧的网络幻灯片制作视频。首先,我有 jpeg 和音频文件,它们在旧系统中用作 Flash 幻灯片,结构如下:

音频结构

  • my_audio_1.mp3(这个文件是一个 3 秒的静音 mp3)
  • my_audio_2.mp3
  • my_audio_3.mp3
  • my_audio_4 等...每个幻灯片大约 30 mp3

图像结构

  • my_image_1.jpg(作为开场幻灯片)
  • my_image_2.jpg
  • my_image_3.jpg
  • my_image_4。等等...每个幻灯片大约有 30 张图片

由于几乎有 100 个幻灯片必须转换为视频,因此我使用 PHP 创建了一个基于 Web 的界面来自动化该过程,该界面位于本地系统上并尝试使用shell_exec()组合文件。该过程使用以下工作流程:

  1. 循环浏览每张幻灯片并制作 avi 或 mpeg。因此,例如my_mini_video_2.avi将是一个包含my_image_2.jpg并具有my_audio_2.mp3配乐的视频。这张幻灯片将持续my_audio_2.mp3的长度。
  2. 加入/缝合/连接所有迷你视频以创建最终视频(使用catmencoderffmpeg的组合(我也尝试过avimerge但无济于事)。
  3. 将新的“主”视频转码为各种格式,例如 flv 等。

我认为这很简单,并且在很多情况下都接近过,但它仍然不起作用。我无法通过第 2 阶段,因为我无法获得完美的“主”视频。我现在已经对 Mencoder、FFMpeg 进行了试验,并且似乎已经完成了我能想到的每一种组合。该问题是,音频和视觉效果从来没有同步,无论我怎么努力。

此外,我什至尝试创建无音频迷你视频,使用catmp3wrap将 MP3 连接成一个长 MP3 ,然后将新的长 MP3 指定为音轨,但这总是会产生一个非常短的文件或严重减慢down 文件并使女性画外音听起来像一个男性拳击手!!!

原始文件似乎完全没有问题。

有没有人有从同类起点成功制作视频的经验?或者关于我可能做错了什么的任何想法?

举个例子:

如果我创建无声迷你视频,然后将它们拼接成“temp-master.mpg”,然后将 MP3 拼接成名为“temp-master-audio.mp3”的单个 MP3,则音频文件的持续时间为 09:10,并且视频文件的持续时间为 08:35。它们应该是相同的,音频看起来会很慢。

我没有发布代码,因为我已经写了很多很多组合。

2010 年 3 月 21 日更新

感谢 Michael Steele 关于 AviSynth 和 VirtualDub 的推荐(并且我已经添加了 GScript 插件),我已经取得了一些进展,这个脚本几乎可以工作了。现在唯一的问题是,虽然在这个例子中 4 个迷你视频根据我的需要被添加到彼此旁边,但迷你视频总是相同的(例如video-4、video-4、video-4、video- 4而不是video-1, video-2, video-3, video-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)
    """)
}
Run Code Online (Sandbox Code Playgroud)

所以这几乎就在那里,但我只需要找出为什么迷你视频不增加?

Mic*_*ele 1

您的问题可能是由于源内容中的帧速率不同造成的。使用 MediaInfo 等应用程序来确定这是否是问题所在。

建议#1

我已经成功地使用 AviSynth 和 VirtualDub 来完成此类任务。Avisynth 根据您编写的脚本创建视频流。它非常适合组合多个小文件,因为您可以设置精确的时间。您可能必须使用众多第 3 方插件之一才能在设定的时间段内显示连续的 .jpg 图像。

一旦您对 AviSynth 生成的内容感到满意,请使用 VirtualDub 将其编码为您想要的任何格式。

建议#2

分别进行音频和视频拼接,然后作为最后一步合并两个流。

  1. 使用 Audacity 等音频编辑器创建一个母版 .mp3 或未压缩的 .wav。
  2. 像您一直在做的那样创建幻灯片视频。
  3. 合并两个流。VirtualDub 可以做到这一点,但是对于这么简单的事情来说有点麻烦。我用过ripbot264。流行的 Handbrake 工具也可能可以做到这一点。