如何使用ffmpeg将所有音频流(在一个视频文件中)合并到一个音频通道中?

wki*_*ugh 2 audio video ffmpeg

我正在尝试将ffmpeg用于许多文件。在使用ffmpeg之前,每个文件的音频流的实际数量(通常每个流通常有一个通道)是未知的。期望的结果是使ffmpeg以某种方式获取音频通道的数量,使用命令行中的数字将那些通道合并到一个音频通道中。目标是创建原始视频文件的预览版本,以在简单的HTML5页面中使用。仅用一次拨打ffmpeg就能实现吗?(此外,道歉是我仍在学习的部分问题)

编辑:Dumas stackoverflow询问器在这里。是的,我一直在尝试ffmpeg args的多种组合。为了回答另一个问题,我们的视频文件具有多个流,通常具有单个通道。我将很快发布一些cmdline示例。

这个cmdline示例可以满足我的要求。一共有8个流,并且我能够将所有音频合并为一个。问题是在运行ffmpeg之前必须知道数字:

ffmpeg -i EXAMPLE.MOV -filter_complex "[0:v]scale=-2:720,format=yuv420p[v];[0:a]amerge=inputs=8[a]" -map "[v]" -map "[a]" -c:v libx264 -crf 23 -preset medium -c:a libmp3lame -ar 44100 -ac 2 OUTPUT.mov
Run Code Online (Sandbox Code Playgroud)

Sco*_*tKu 10

以下命令应该执行与 llogan 的答案相同的操作,但不会重新压缩视频轨道,并要求您确定应将多少个音轨合并在一起。

如果您想知道有多少音频流,请尝试:

ffprobe originalfile.mov 2>&1 | grep 'Stream #'
Run Code Online (Sandbox Code Playgroud)

一旦您确定了应合并多少个音频流,请在此处的 amerge=inputs=2 参数中使用该数字。此命令会将流合并为一个并使用 aac 压缩重新压缩音频。

ffmpeg -i originalfile.mov -c:v copy -c:a aac -b:a 160k -ac 2 -filter_complex amerge=inputs=2 output.mp4
Run Code Online (Sandbox Code Playgroud)


llo*_*gan 5

您可以使用ffprobe查找音频流的数量,并将输出用作ffmpeg命令中的变量。Bash示例wc用于计算以下列出的音频流ffprobe

ffmpeg -i input.mov -filter_complex "[0:v]scale=-2:720,format=yuv420p[v];[0:a]amerge=inputs=$(ffprobe -loglevel error -select_streams a -show_entries stream=codec_type -of csv=p=0 input.mov | wc -l)[a]" -map "[v]" -map "[a]" -c:v libx264 -crf 23 -preset medium -c:a libmp3lame -ar 44100 -ac 2 output.mov
Run Code Online (Sandbox Code Playgroud)

  • @wkimbrough如果解决了您的问题,请选择此作为您的首选答案。它解决了我的问题。 (2认同)