如何将 WMV 文件中的视频与两个 MP4 视频文件中的音频合并为第三个 MP4 文件,并在生成的 MP4 文件中保留立体声?

如何将 WMV 文件中的视频与两个 MP4 视频文件中的音频合并为第三个 MP4 文件,并在生成的 MP4 文件中保留立体声?

我目前正在使用此 FFmpeg 命令从 WMV 视频创建一个 MP4 视频,作为来自多个 MP4 的马赛克文件的组件;该视频的时长约为 30 秒:

ffmpeg -i TFootpFA.wmv -vf "crop=1092:788, eq=1.2:.03:gamma_g=.8:gamma_b=.7, scale=1020x706" -b:v 3M TFootpFA.mp4

我想进行调整以从另外两个视频文件(它们都具有单声道或左/右立体声音频)中获取音频,并使用它们的音频作为最终 MP4 文件的音频,如下所示;调用这些文件audioL.mp4audioR.mp4):

  • 我想创建带有立体声音频的 MP4。
  • 音频来自audioL.mp4左声道。
  • 音频audioR.mp4将来自正确的频道。
  • 如果音频是立体声,则每个通道的音频都应合并/混音为一个通道。

所有三个文件的持续时间是相同的(在几帧之内),但我希望目标持续时间严格与我已经在使用的主 WMV 文件的持续时间相同TFootpFA.wmv

我可以使用哪些参数来实现这一点?


编辑:在最初发布这个问题之后,我发现另一个超级用户问题似乎在问同样的问题,并且得到了这个命令 “尝试使用 FFmpeg 编码多个音频文件并将其映射到特定频道”

 ffmpeg -i video.mov -i audio1.wav -i audio2.wav -filter_complex
 "[1:a][2:a]amerge=inputs=2,pan=stereo|c0<c0+c1|c1<c2+c3,apad[aout]"
-map 0:v -map "[aout]" -shortest output.mp3

虽然此命令的输出是 MP3 文件而不是视频文件,但是否可以将这些设置用于我已有的 FFmpeg 命令?


编辑:FWIW,我发现我最初使用的命令行在源 WMV 文件中采用立体声音频,并在生成的 MP4 文件中产生单声道音频。我尝试了各种过滤器,以使生成的 MP4 文件保留原始 WMV 文件的立体声音频,但我尝试的都没有奏效。如何我做到了吗?


编辑:我尝试了Gyan在他的回答中发布的方法:

ffmpeg -i TFootpFA.wmv -i audioL.mp4 -i audioR.mp4 -filter_complex "[0]crop=1092:788, eq=1.2:.03:gamma_g=.8:gamma_b=.7, scale=1020x706[v];[1]aformat=channel_layouts=mono[l];[2]aformat=channel_layouts=mono[r];[l][r]amerge=2,apad[a]" -map "[v]" -map "[a]" -b:v 3M -shortest TFootpFA.mp4

不幸的是,结果就是 FFmpeg 一直卡在运行frame=1,而它的“时间”设置在几分钟的执行时间内就累积了超过 3 个小时,直到我终止它。最终文件无法使用,尽管它确实报告了超过 3 个小时的长度。

碰巧的是,我遇到的卡住情况frame=1与我之前尝试在操作中使用 WMV 文件时遇到的情况相同-filter_complex,正如我在一年前在 Video Stack Exchange

当时,我决定采用一种变通方法,将 WMV 文件转换为 MP4 文件,然后使用它们创建“视频马赛克” -filter_complex。事实上,这就是我为这个问题编写的原始命令行的一个例子。

在这次 WMV 文件失败之后,我尝试使用 Gyan 的方法处理 MP4 文件。

现在,我之前提到过,我的所有文件都具有相同的持续时间;短片段大约为 30 秒。Gyan 的 MP4 文件命令确实避免了卡在 上frame=1,但当时间达到约 30 秒时,它并没有完成,而是卡在 上frame=900,然后迅速积累了自己的长时间值(在我终止它之前已超过一个小时)。生成的文件播放了大约 30 秒,然后再次卡住。这是我到目前为止所得到的。

与此同时,我四处寻找替代策略。我没有找到任何真正对我有用的方法,但我尝试了根据途中收集到的线索想出的办法。

我又采用了更冗长的方法,将两个音频源视频文件(我发现它们都是单声道音频)中的音频提取到 MP3 文件中,然后使用以下命令将这些 MP3 文件的音频数据组合成立体声 MP3 文件:

ffmpeg -i audioL.mp3 -i audioR.mp3 -filter_complex "join=map=0.0-FL|1.0-FR" TwoSound.mp3

它运行正常,直到 30 秒内运行到大约 21 秒时,FFmpeg 崩溃了。

然而,最终生成的文件至少是一个可以正常运行的立体声 MP3 文件,时长为 21 秒。

然后我决定返回并TFootpFA.wmv使用 Windows Live Movie Maker 重新创建这个新文件作为其音轨,我最初在那里创建了 WMV 文件。

由于声音本身只是非常普通的音效,我将新的 21 秒音频文件应用到要制作的视频中,然后添加音频文件第二次迭代的 9 秒,以达到视频所需的完整 30 秒。这很有效,现在我的文件TFootpFA.wmv已经包含了我想要的立体声音频(或令人满意的近似值),然后开始执行我的原来的命令行来获取TFootpFA.mp4所需的立体声音频。

但这就是我遇到的最新障碍:使用我原来的命令,生成的 MP4 有音频简化为单声道!显然我的转换为 MP4 的方法总是有这样的结果;我只是之前从未检查过这一点。

所以然后我尝试了各种 FFmpeg 过滤器,试图确保生成的 MP4 文件保留 WMV 源的立体声特性,但没有任何效果:MP4 文件始终是单声道的。

最后我以这个问题作为结束:

有谁知道我促使 FFmpeg 让完成的 MP4 文件保留 WMV 源的立体声音频?

答案1

使用

ffmpeg -i TFootpFA.wmv -i audioL.mp4 -i audioR.mp4 -filter_complex "[0]crop=1092:788, eq=1.2:.03:gamma_g=.8:gamma_b=.7, scale=1020x706[v];[1]aformat=channel_layouts=mono[l];[2]aformat=channel_layouts=mono[r];[l][r]amerge=2,apad[a]" -map "[v]" -map "[a]" -b:v 3M -shortest TFootpFA.mp4

(由于您的音频输入可能是单声道,链接的答案不可靠,因为它假设立体声输入)

答案2

所以我最终发现它与音频质量(比特率/采样率)有关。我创建的 WMV 文件包含相对“低等级”的音频(尽管是立体声),显然 ffmpeg 自动决定最好在输出文件中将音频降低为单声道。由于源 WMV 中的音频质量较高,ffmpeg 最终在输出视频中保留了立体声格式。

相关内容