【问题标题】:Handbrake: save custom preset/encoding command out for use on handbrake-cli on another machineHandbrake:保存自定义预设/编码命令以在另一台机器上的 handbrake-cli 上使用
【发布时间】:2014-01-03 14:33:13
【问题描述】:

我有一堆视频要转换,从 flv 到 mp4。在 Ubuntu 的 Handbrake gui 中,我已整理好所有设置。我已将其保存为名为“所有平板电脑”的预设。

我需要在不同的 ubuntu 机器上使用 HandBrakeCLI,这只是命令行。所以,我可以看到两个选项,但我不知道如何做:

1) 查看 handbrake gui 使用的设置,因此我可以复制它们并直接使用 HandBrakeCLI,并根据需要替换文件名。

2) 保存我的“所有平板电脑”预设,以便我可以将其复制到另一台机器上并在那里与 HandBrakeCLI 一起使用。

选项 2 似乎更好。当我在 HandBrakeCLI 中列出可用的预设时,它没有列出我的自定义预设,这表明 GUI 版本将它们保存到与 cli 版本不同的位置。

有什么建议吗?谢谢,马克斯

【问题讨论】:

    标签: ubuntu handbrake


    【解决方案1】:

    我实际上最终弄清楚了这一点:我在 Windows 7 虚拟机中尝试了 Windows 版本的 Handbrake。在 Windows 中,GUI 版本只是 CLI 的包装,不像 Linux,它们是两个完全独立的东西。 (我不确定 Mac 上的情况如何)。

    我首先尝试导入我从 linux 版本中保存的预设 plist 文件,但 windows gui 无法正确解析它,或者无论如何都不满意:它似乎正在处理其中一个布尔值,就好像它是一个变量名(即尝试做类似true = "foo" 之类的事情):我无法在我的 plist 文件中找出导致此问题的原因:将其与保存的 out放在一边> 窗户,看起来不错。

    所以,我在 Windows GUI 中从头开始。界面的样式略有不同,但我能够设置我的 linux gui 中的所有选项。然后我使用这些设置进行了转换:因为 windows gui 使用 CLI 版本,您可以在转换日志中看到发送到 cli 的命令。我复制了这个,并在 linux CLI 中尝试了相同的选项集,效果很好。

    我从没想过我会写这篇文章作为对任何问题的回答,但答案似乎是“使用 windows”;-) 谁会想到它。

    【讨论】:

    • 谢谢,这正是我想要的。在 mho 中,它应该是真正的答案。
    【解决方案2】:

    ~/.ghb/presets 将您的 GUI 预设存储为 PropertyList(它是一种 XML 文档)。您可以从此处获取设置并将它们转换为 CLI 的命令行参数。遗憾的是,CLI 不会读取 GUI 的配置文件或任何其他配置。如果您可以使用 C(++) 编写代码,那么添加该支持可能不会太难。 CLI 位于 Handbrake 源代码树中的 test/test.c 中。

    这是一个快速而肮脏的 Python 代码,可以帮助您入门。 Plist.py 可以在这里找到http://winappdbg.sourceforge.net/blog/PList.py:

    #!/usr/bin/env python                                                                                                    
    import sys
    
    import PList
    
    def translate(item):
        args = []
    
        if "AudioList" in item:
            args.append(("-E", item["AudioList"][0]["AudioEncoderActual"]))
    
        return args
    
    def invoke(args):
        print "HandbrakeCLI " + " ".join(" ".join(arg) for arg in args)
    
    presets = sys.argv[1]
    name = sys.argv[2]
    
    data = PList.fromstring(open(presets).read())
    
    for item in data:
        if isinstance(item, dict):
            if 'PresetName' in item:
                if item['PresetName'] == name:
                    invoke(translate(item))
    

    祝你好运,玩得开心。

    【讨论】:

    • 谢谢肖恩,这是非常有用的信息。不过,我正在努力将 ghb 的选项转换为 CLI 选项:例如,第一对是 <key>AudioAllowAACPass</key> <true />。我正在查看此页面https://trac.handbrake.fr/wiki/CLIGuide,但找不到与“AudioAllowAACPass”对应的 CLI 选项。翻译需要音频编码方面的专业知识吗?
    • 我不确定所有这些都直接相关。您可能需要在这里做一些实验。匹配所有你可以尝试的。然后,您将开始寻找如何将属性列表与 CLI 公开的选项相匹配的代码。您可能需要扩展 CLI 以处理所有这些问题。
    • 这就是我害怕的:/ 两组选项如此不同,这有点烦人。我想我可以通过一些脚本来解决这个问题,这些脚本会执行很多不同的版本,并使用 diff 来告诉我什么时候得到与 gui 生成的版本相同的结果。谢谢!
    • 同意。我经常处理情节内容,所以虽然我更喜欢 CLI,但我更倾向于使用 GUI。我相信您正在开发的工具可能会很受欢迎。让它接近工作,让开源世界帮助你让它变得更好。我知道我会使用它。我之前考虑过写它:-) 孩子和生活虽然.....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2020-06-21
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多