Jak korzystać z ffmpeg do konwersji plików dźwiękowych

13

Używam ffmpeg v2.8.1 z Homebrew i próbuję przekonwertować pliki Audible , ale brakuje mi sztuczki.

To polecenie generuje ten błąd.

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

Wiem, że plik jest w porządku, ponieważ można go odtwarzać w iTunes. Mam również osadzony plik obrazu / okładki,

Z dokumentów ffmpeg czytam, że pliki Audible AAX są zaszyfrowanymi plikami M4B i można je odszyfrować, podając 4-bajtową tajemnicę aktywacyjną.

Zakładam - prawdopodobnie niepoprawnie - że podany jest w porządku. Jeśli nie, to jak znaleźć ten sekret.

Harry McGovern
źródło
Zobacz także github.com/KrumpetPirate/AAXtoMP3
Arto Bendiken

Odpowiedzi:

31

Najpierw uruchom następujące polecenia:

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

Następnie wprowadź swoją nazwę użytkownika i hasło Audible i poczekaj chwilę na wydrukowanie ośmioznakowego klucza aktywacyjnego.

Jeśli nie uruchomisz sedpolecenia zmieniającego wartość chromedriver_pathzmiennej, ./audible-activator.pyspowoduje to błąd, 'chromedriver' executable needs to be in PATHnawet jeśli chromedriverznajduje się na ścieżce lub w audible-activatorkatalogu. Jeśli sedjest GNU sed, wymienić sed -i ''z sed -i.

Następnie uruchom następującą komendę:

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

(I edycja komendy powyżej na podstawie uwag Liwang i Marcus erronius zastąpić output.m4a;mv output.m4{a,b}z output.m4bi do zastąpienia -vn -c:v copyz -c copy).

Próba użycia ffmpegpowyższego polecenia z aaplikiem zamiast aaxpliku spowoduje błąd podobny do tego Option activation_bytes not found. Aby pobrać książkę z Audible as aaxzamiast aa, wybierz „Ulepszone” z menu rozwijanego „Jakość dźwięku” w widoku pobierania książki.

aaxPliki są szyfrowane mp4/ m4a/ m4bpliki więc ffmpegkomenda powyżej nie ponownego kodowania dźwięku i zachowuje metadane, takie jak rozdziałach. mp4, m4ai m4bsą alternatywnymi rozszerzeniami nazw plików w formacie kontenera MPEG-4 część 14. m4aI m4brozszerzenia zostały pierwotnie wprowadzone przez Apple. Jedną różnicą między rozszerzeniami m4ai m4bjest to, że opcja zapamiętywania poprzedniej pozycji odtwarzania w iTunes jest domyślnie włączona dla plików z m4brozszerzeniem, ale nie dla plików z m4arozszerzeniem. iTunes m4bdomyślnie wyświetla również pliki z rozszerzeniem w książkach audio.

Stare wersje iTunes nie miały pola wyboru, które umożliwiało zapamiętanie poprzedniej pozycji odtwarzania, ale zapamiętywanie poprzedniej pozycji odtwarzania było zawsze włączone dla plików z m4brozszerzeniem, więc nawet Wikipedia nadal błędnie stwierdza, że ​​„ .m4aplik audio nie może„ zakładki ”(pamiętaj ostatnie miejsce odsłuchu), podczas gdy .m4bpliki rozszerzeń mogą. ” (Mimo że nie wiem, czy istnieją jeszcze inne odtwarzacze multimedialne, które zachowują się pod tym względem jak stare wersje iTunes).

Interfejs użytkownika dla m4brozszerzenia jest, com.apple.protected-mpeg-4-audioa Finder pokazuje rodzaj wszystkich m4bplików jako „chronione audio MPEG-4”, nawet jeśli wszystkie pliki z m4brozszerzeniem nie mają ochrony przed kopiowaniem.

nisetama
źródło
Używam .aaxplików i uzyskiwanie błąd: Unrecognized option 'activation_bytes'.. Jakieś pomysły? Czy Audible zmieniło format w zeszłym roku?
Lollercoaster
3
Czy jest jakiś powód do konwersji, *.m4aa następnie zmiany nazwy na *.m4b? Dlaczego po prostu nie robić: ffmpeg -activation_bytes youractivationkey -i input.aax -vn -c:a copy output.m4b?
Li Wang
1
@LiWang To spowodowało błąd ze starszymi wersjami ffmpeg, ale wydaje się, że już tak nie jest.
nisetama
@ user4669748 Rozumiem. Dziękuję za potwierdzenie!
Li Wang,
Musiałem użyć tego polecenia, aby Python działał, ale potem wszystko poszło idealnie! ln -sf /usr/bin/python2.7 / usr / local / bin / python2
Sethmr 10.1018
7

Otrzymasz swój sekret aktywacyjny:

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

Sztywny
źródło
1
Użyłem tego skryptu do faktycznej konwersji. Warto również zauważyć, że musisz zainstalować seleniumi requestsza pomocą piplub, easy_installa także pobrać i rozpakować chromeedriver do audible-activatorkatalogu, aby działał. Informacje te znajdują się w audible-activatorREADME, ale warto wiedzieć z góry :)
intuicyjnie,
Dzięki, @intuited; ten skrypt jest złoty. Potrzebowałem lekkich poprawek, aby używać GNU grep ( ggrepzainstalowanego z brew install grep) na Macu, ale potem wykonałem świetną robotę.
ecmanaut
6

Wypróbowałem odpowiedź user4669748 i natknąłem się na kilka rzeczy, na które warto zwrócić uwagę, i odkryłem poprawkę, która sprawiła, że ​​coś mi działało:

  1. audible-activator.py wymaga Python 2.7; nie działa z Python 3.
  2. Po uruchomieniu okno Chrome wyskakuje na ekranie i zaczynasz widzieć aktywność GUI oraz udane logowanie do Audible.
  3. Wkrótce po zalogowaniu aktywność przeglądarki wydaje się zawieszać i Waiting for px.owneriq.netstale wyświetla się na dolnym pasku stanu.
  4. Po 5 minutach miałem wyjątek Timeout:

    [*] 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)
    

W tym utknąłem. Jednak myśląc, że px.owneriq.netjest to rodzaj reklamy lub witryny śledzącej, próbowałem ją „tymczasowo wyłączyć”, dodając /etc/hostsnieprawidłowy adres IP, np.

0.0.0.0 px.owneriq.net

(To była taktyka zaproponowana przez znajomego, aby zatrzymać reklamy w przeglądarce).

Po tym dodaniu /etc/hostsuruchom ponownie program. Po ukończeniu w 30 sekund.

4-bajtowy klucz aktywacyjny został wydrukowany na ekranie i działał idealnie z ffmpeg, jak opisano w odpowiedzi user4669748.

Następnie przywróciłem /etc/hostsoryginalną zawartość.

devopsmikey
źródło