如何使用ffmpeg转换声音文件


10

我正在从Homebrew运行ffmpeg v2.8.1,并尝试转换 听得见 文件,但有一些技巧我失踪了。

此命令产生此错误输出。

ffmpeg -activation_bytes 1CEB00DA -i Volume1.aax -vn -c:a copy output.mp4

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fc9a4010600] [aax] file checksum == d72f1f04e3c73d0bc68e742db1bc69b58dc3a500
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fc9a4010600] [aax] mismatch in checksums!
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fc9a4010600] error reading header
Volume1.aax: Invalid data found when processing input

我知道文件没问题,因为它在iTunes中播放。我也有嵌入文件图像/封面的艺术品,

从ffmpeg文档中,我读到了 Audible AAX文件是加密的M4B文件 ,并且可以通过指定4字节激活密钥来解密它们。

我假设 - 可能是错误的 - 给出的那个是好的。如果没有,那么如何找到这个秘密。


Answers:


24

首先运行这些命令:

brew install chromedriver ffmpeg
sudo easy_install pip
pip install selenium requests
git clone https://github.com/inAudible-NG/audible-activator
cd audible-activator
sed -i '' 's,chromedriver_path = "./chromedriver",chromedriver_path = "/usr/local/bin/chromedriver",' audible-activator.py
./audible-activator.py

然后输入您的Audible用户名和密码,等待一段时间打印八字符激活密钥。

如果你不运行 sed 更改值的命令 chromedriver_path 变量, ./audible-activator.py 导致错误,如 'chromedriver' executable needs to be in PATH 即使 chromedriver 在路上或在路上 audible-activator 目录。如果你的 sed 是GNU sed,替换 sed -i ''sed -i

之后运行如下命令:

ffmpeg -activation_bytes youractivationkey -i input.aax -c copy output.m4b

(我根据LiWang和marcus erronius的评论编辑了上面的命令来取代 output.m4a;mv output.m4{a,b}output.m4b 并取代 -vn -c:v copy-c copy。)

如果你试图使用 ffmpeg 用上面的命令 aa 文件而不是 aax 文件,它会导致错误 Option activation_bytes not found。从Audible下载书籍 aax 代替 aa,从视图中的“音频质量”下拉列表中选择“增强”以下载图书。

aax 文件已加密 mp4 / m4a / m4b 文件所以 ffmpeg 上面的命令不会重新编码音频,它会保留元数据,例如章节。 mp4m4a,和 m4b 是MPEG-4 Part 14容器格式的替代文件扩展名。该 m4am4b 扩展最初由Apple引入。一个区别 m4am4b 扩展名是默认情况下,对于带有文件的文件启用了记住iTunes中前一个播放位置的选项 m4b 扩展名但不适用于带文件的文件 m4a 延期。 iTunes还会​​显示带有的文件 m4b 默认情况下,有声读物下的扩展名。

iTunes的旧版本没有用于记住上一个播放位置的复选框,但是对于具有以下播放位置的文件,始终会记住之前的播放位置。 m4b 扩展,所以即使维基百科仍然错误地指出“一个 .m4a 音频文件不能“书签”(记住最后一个收听点),而 .m4b 扩展文件可以。“(即使我不知道是否还有其他媒体播放器在这方面表现得像旧版本的iTunes。)

UTI为 m4b 扩展是 com.apple.protected-mpeg-4-audio 和Finder显示了所有的一切 m4b 文件为“受保护的MPEG-4音频”,即使所有文件都带有 m4b 扩展名没有复制保护。


我正在使用 .aax 文件并收到错误: Unrecognized option 'activation_bytes'.。有任何想法吗? Audible在去年改变了他们的格式吗?
lollercoaster

1
有任何理由转换为 *.m4a 然后重命名为 *.m4b?为什么不这样做: ffmpeg -activation_bytes youractivationkey -i input.aax -vn -c:a copy output.m4b
Li Wang

1
@LiWang它导致旧版本的ffmpeg出错,但似乎不再是这种情况。
nisetama

@ user4669748我明白了。谢谢你的确认!
Li Wang

我不得不使用这个命令让python工作,但在此之后变得完美! ln -sf /usr/bin/python2.7 / usr / local / bin / python2
Sethmr

7

这将为您提供激活秘诀:

https://github.com/inAudible-NG/audible-activator


1
我用了 这个脚本 做实际的转换。值得注意的是你必须安装 seleniumrequests 通过 pip 要么 easy_install 并下载并提取chromedriver到 audible-activator 它的工作目录。此信息提供 audible-activator 的自述文件,但前面知道它是有用的:)
intuited

谢谢,@ intuited;那个剧本是黄金。需要轻微调整才能使用GNU grep( ggrep 安装 brew install grep )在macos上,但在那之后做得很好。
ecmanaut

6

我尝试了user4669748的答案,并遇到了一些值得注意的事情,并发现了一个让我能够工作的修复:

  1. audible-activator.py需要Python 2.7;它失败了Python 3。
  2. 启动后,屏幕上会弹出Chrome窗口,您将开始看到GUI活动,并成功登录Audible。
  3. 登录后不久,浏览器活动似乎挂起了 Waiting for px.owneriq.net 不断显示在底部状态栏中。
  4. 5分钟后,我遇到了TimeoutException:

    [*] Player ID is 2jmj7l5rSw0yVb/vlWAYkK/YBwk=
    Traceback (most recent call last):
      File "./audible-activator.py", line 151, in <module>
        fetch_activation_bytes(username, password, options)
      File "./audible-activator.py", line 74, in fetch_activation_bytes
        search_box.submit()
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 88, in submit
        self._execute(Command.SUBMIT_ELEMENT)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 494, in _execute
        return self._parent.execute(command, params)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
        self.error_handler.check_response(response)
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.TimeoutException: Message: timeout: cannot determine loading status
    from timeout: Timed out receiving message from renderer: -0.222
      (Session info: chrome=54.0.2840.98)
      (Driver info: chromedriver=2.25.426935 (820a95b0b81d33e42712f9198c215f703412e1a1),platform=Mac OS X 10.12.0 x86_64)
    

在这,我被困住了。但是,想一想 px.owneriq.net 是某种广告或跟踪网站,我试图通过添加“临时禁用”它 /etc/hosts 使用无效的IP地址,例如

0.0.0.0 px.owneriq.net

(这是朋友建议在浏览器中停止广告的策略。)

此后加入 /etc/hosts,重新运行该程序。它在30秒内完成。

一个4字节的激活密钥被打印到屏幕上,并与ffmpeg完美配合,如user4669748的答案中所述。

然后我恢复了 /etc/hosts 原始内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.