¿Cómo uso ffmpeg para convertir archivos audibles?

13

Estoy ejecutando ffmpeg v2.8.1 desde Homebrew e intento convertir archivos Audible , pero me falta un truco.

Este comando produce esta salida de error.

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

Sé que el archivo está bien, porque se reproduce en iTunes. También tengo la imagen de archivo / portada incrustada,

De los documentos de ffmpeg, leí que los archivos Audible AAX son archivos M4B cifrados , y se pueden descifrar especificando un secreto de activación de 4 bytes.

Supongo, probablemente incorrectamente, que el dado está bien. Si no, ¿cómo se encuentra ese secreto?

Harry McGovern
fuente
Ver también github.com/KrumpetPirate/AAXtoMP3
Arto Bendiken

Respuestas:

30

Primero ejecute estos comandos:

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

Luego ingrese su nombre de usuario y contraseña Audible y espere un momento a que se imprima la clave de activación de ocho caracteres.

Si no ejecuta el sedcomando que cambia el valor de la chromedriver_pathvariable, se ./audible-activator.pyproduce un error como 'chromedriver' executable needs to be in PATHsi estuviera chromedriveren la ruta o en el audible-activatordirectorio. Si su sedes GNU sed, reemplace sed -i ''con sed -i.

Después de eso, ejecute un comando como este:

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

(Edité el comando anterior basado en los comentarios de LiWang y marcus erronius para reemplazar output.m4a;mv output.m4{a,b}con output.m4by para reemplazar -vn -c:v copycon -c copy).

Si intenta utilizar el ffmpegcomando anterior con un aaarchivo en lugar de un aaxarchivo, se produce un error como Option activation_bytes not found. Para descargar un libro de Audible en aaxlugar de aa, seleccione "Mejorado" en el menú desplegable "Calidad de audio" en la vista para descargar un libro.

aaxlos archivos están encriptados mp4/ m4a/ m4bpor lo que el ffmpegcomando anterior no vuelve a codificar el audio y conserva los metadatos, como los capítulos. mp4, m4ay m4bson extensiones de nombre de archivo alternativas para el formato de contenedor MPEG-4 Parte 14. Las extensiones m4ay m4bfueron introducidas originalmente por Apple. Una diferencia entre las extensiones m4ay m4bes que la opción para recordar la posición de reproducción anterior en iTunes está habilitada de manera predeterminada para archivos con una m4bextensión pero no para archivos con una m4aextensión. iTunes también muestra archivos con una m4bextensión en audiolibros de forma predeterminada.

Las versiones anteriores de iTunes no tenían la casilla de verificación para permitir recordar la posición de reproducción anterior, pero recordar la posición de reproducción anterior siempre estaba habilitada para archivos con una m4bextensión, por lo que incluso Wikipedia aún afirma incorrectamente que "un .m4aarchivo de audio no puede" marcar "(recuerde último lugar de escucha), mientras que los .m4barchivos de extensión pueden ". (Aunque no sé si todavía hay otros reproductores multimedia que se comporten como versiones antiguas de iTunes a ese respecto).

La UTI para la m4bextensión es com.apple.protected-mpeg-4-audioy Finder muestra el tipo de todos los m4barchivos como "audio MPEG-4 protegido" aunque todos los archivos con una m4bextensión no tienen protección contra copia.

nisetama
fuente
Estoy usando .aaxarchivos y conseguir el error: Unrecognized option 'activation_bytes'.. ¿Algunas ideas? ¿Audible ha cambiado su formato en el último año?
lollercoaster
3
¿Alguna razón para convertir *.m4ay luego renombrar como *.m4b? ¿Por qué no simplemente hacer ffmpeg -activation_bytes youractivationkey -i input.aax -vn -c:a copy output.m4b:?
Li Wang
1
@LiWang Se produjo un error con versiones anteriores de ffmpeg, pero ese ya no parece ser el caso.
nisetama
@ user4669748 Ya veo. ¡Gracias por la confirmación!
Li Wang
Tuve que usar este comando para que Python funcionara, ¡pero después de esto fue perfecto! ln -sf /usr/bin/python2.7 / usr / local / bin / python2
Sethmr
7

Esto te dará tu secreto de activación:

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

Rígido
fuente
1
Usé este script para hacer la conversión real. Es también digno de mención que usted tiene que instalar seleniumy requestsvía pipo easy_installtambién descargar y chromedriver extracto en el audible-activatordirectorio para que funcione. Esta información se proporciona en audible-activatorel archivo README, pero es útil saberlo por adelantado :)
intuido el
Gracias, @intuited; Ese guión es oro. Necesitaba ajustes ligeros para usar GNU grep (el ggrepinstalado con brew install grep) en macos, pero hizo un gran trabajo después de eso.
ecmanaut
6

Intenté la respuesta de user4669748, me encontré con algunas cosas que vale la pena señalar y descubrí una solución que me funcionó:

  1. audible-activator.py requiere Python 2.7; falla con Python 3.
  2. Después de iniciarlo, la ventana de Chrome aparece en la pantalla y comienza a ver la actividad de la GUI y un inicio de sesión exitoso en Audible.
  3. Poco después de iniciar sesión, la actividad del navegador parece bloquearse, y Waiting for px.owneriq.netse muestra constantemente en la barra de estado inferior.
  4. Después de 5 minutos, tuve una 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)
    

Ante esto, estaba atrapado. Sin embargo, pensando que px.owneriq.netes algún tipo de anuncio o sitio de seguimiento, traté de "deshabilitarlo temporalmente" agregando /etc/hostsuna dirección IP no válida, p. Ej.

0.0.0.0 px.owneriq.net

(Esta fue una táctica sugerida por un amigo para detener los anuncios en el navegador).

Después de esta adición a /etc/hosts, vuelva a ejecutar el programa. Funcionó hasta su finalización en 30 segundos.

Se imprimió una clave de activación de 4 bytes en la pantalla y funcionó perfectamente con ffmpeg como se describe en la respuesta del usuario 46979748.

Luego restauré /etc/hostssu contenido original.

devopsmikey
fuente