處理包含多種音訊格式的資料夾的最佳方法

好,我有一整個資料夾的 mkv 想要批次處理。我正在想怎麼妥善處理音軌。

我的檔案混有立體聲、環繞聲,甚至還有單聲道。我的目標是設定一個任務:凡是 2 聲道(含)以下的就用一組音訊設定,超過 2 聲道的就用另一組。MCEBuddy 已經內建這功能,但只限 AC3,所以會跳過 DTS 之類的格式。

我本來想直接讓 AAC 穿透(pass-through),因為它最可能是 2 聲道來源;但我也會遇到 2 聲道的 EAC3、AC3、FLAC 等。所以單靠編碼器來猜 2 聲道並不可靠。6 聲道來源如果是 AC3 或 EAC3,直接穿透對我沒問題,但我不想留 DTS,因為檔案要壓小,DTS 實在太重。

我記得看過一篇討論,有人用 CLI 指令依音訊位元率決定是否穿透:低於約 200 kbps 就當作 2 聲道以下,高於就當作 6 聲道之類。可惜我沒收藏那串討論,現在怎麼找都找不到。

所以,我想徵求建議:如果是你,會怎麼處理這種資料夾?

这里有一个使用配置文件的替代方案。MCEBuddy 配置文件有一项名为“不支持的组合”的功能。简单来说,对于某个配置文件编码器,你可以指定一组不被支持的视频、音频与容器参数组合;一旦遇到这种组合,该编码器就会被跳过,并继续尝试下一个编码器。更多细节见:

利用该参数,你可以用两种思路来处理:

  1. 让第一个编码器跳过某些组合(例如 HandBrake 不处理 DTS 音轨,仅复制音频流),再由另一个编码器处理剩余情况(ffmpeg 将所有音频轨道编码为 AC3)。示例配置如下(仅列出相关部分,其余请自行补全):

    order=handbrake,ffmpeg
    handbrake-unsupported=dts
    handbrake-audio=-E copy
    handbrake-audioac3=-E copy
    ffmpeg-audio=-acodec ac3 -ab 384k
    ffmpeg-audioac3=-acodec ac3 -ab 384k

  2. 第二种思路是使用带转换任务的配置文件:创建两个配置文件,每个文件只指定一个编码器;在第一个配置文件里把 dts 设为不支持,在第二个配置文件里把 aac,ac3 设为不支持。接着创建两个转换任务,分别使用上述两个配置文件。这样,只有不支持对应音频编解码器的任务会失败,另一个任务则会正常执行。

“fall through”方式是我发帖后第一时间就去看的。它挺有趣,也挺巧妙,能让你按格式隔离设置。可惜那并不是我真正需要的。

我的问题在于:同一种编解码器/格式会有多种声道版本。Atmos 或 DTS 基本可以确定不是 2.0,但 EAC3、AC3、甚至 AAC 或 Flac 都可能是 2.0 也可能是 5.1。于是我可以顺着 profile 顺序一路 fall through 直到命中 AAC,但接下来我无法判断它是 AAC 2.0 还是 5.1 等。换句话说,仅仅隔离编解码器并不能满足需求;我得让 MCEBuddy 自动识别流是 2.0 还是环绕,并据此调整设置。

MCEBuddy 确实内置了判断 2.0 与 5.1 的机制,但只对 AC3 有效。例如,我把上面你贴的那个 profile 里的 ffmpeg-audio 改成 192,因为 384 对立体声来说太高了。

order=handbrake,ffmpeg
handbrake-unsupported=dts
handbrake-audio=-E copy
handbrake-audioac3=-E copy
ffmpeg-audio=-acodec ac3 -ab 192k
ffmpeg-audioac3=-acodec ac3 -ab 384k

用这些设置喂它一个 EAC3 5.1 文件,它会输出 192k 音频;如果输出格式设为 AAC,就会给出 256k 音频,等等。

AAC 的 2.0 与 5.1 同理。只有 AC3 会按预期工作,因为相关逻辑只对它内置了,会自动给出 192k 2.0 或 384k 5.1。换句话说,除了 AC3,ffmpeg-audioac3 这一行完全被忽略,对转换毫无影响,MCEBuddy 只用 ffmpeg-audio 这一行。如果你在 GUI 里勾了“环绕声”,MCEBuddy 会给 ffmpeg-audio 加上 -6ch 标志,当作环绕设置。

我的例子里,2.0 输出用 192k,5.1 输出用 384k。由于 AAC 不是 AC3,MCEBuddy 会忽略 ffmpeg-audioac3=-acodec ac3 -ab 384k,而使用 ffmpeg-audio=-acodec ac3 -ab 192k。如果我在 GUI 里勾了环绕,它会加上 -6ch 标志,最终变成类似 ffmpeg-audio=-acodec ac3 -ab 192k -6ch。若输出也是 AAC,转换开始后会触发某种内部保护,不允许 5.1 用 192k,于是自动把码率提到 256k(AAC 5.1 的最低值),最终得到 256k 5.1 文件。不确定其它格式是否也这样。

理想情况下,要是 ffmpeg-audioac3 能作为所有环绕声的兜底设置,而 ffmpeg-audio 只管 2.0,那就完美了。可惜这功能目前并不存在,找 workaround 至今都很棘手。

你總是可以開一個功能請求來處理非 AC3 音訊的 <encoder>-audiodts 或類似標籤。

如果 <encoder>-audiodts 的運作原理跟 <encoder>-audioac3 一樣,那它應該能行得通,但這樣我就得為每種格式各準備一個──<encoder>-audioflac<encoder>-audioaac……沒完沒了。

我覺得更簡單的做法應該是像這樣:
ffmpeg-audio ≤2ch → 192kb 設定
ffmpeg-audio >2ch → 448kb 設定

換句話說,應該依「聲道數」而非「編碼器」來判斷。這樣不論輸入是什麼編碼器都無所謂。餵它 2 聲道的 FLAC 或 AAC,就輸出 192k;同樣的檔案只要聲道超過 2 個,就輸出 448kb 之類的。

目前我預設的輸出編碼器是 EAC3 448kb。6 聲道時很完美,但 MCEBuddy 不會管輸入是 2 聲道還是 6 聲道,導致 2.0 的檔案也被灌成 448k 的立體聲。448k 的雙聲道根本浪費,這正是我想避免的。

我也明白這功能已超出程式原本範疇。它主要用來剪廣告、壓縮 DVR 檔案。據我所知,沒有任何 DVR 會以 EAC3、FLAC 或 AAC 錄音,所以我等於要求開發者為了跟核心功能無關的東西寫程式。想到這點就覺得過意不去,真希望自己能找出變通辦法。

无需感到难过,创建一个功能请求,说明需求和提出建议,并开放讨论,以便我们能以最优方式推进。

完成。

讓我們看看會發生什麼 :slight_smile: