AudioBook.M4B -> 001.M4A, 002.M4A ... (Как автоматизировать нарезку по главам?)

Вопросы, приемы и проблемы обработки звука

Модератор: Модераторы разделов

Аватара пользователя
alkesta
Сообщения: 345
ОС: Fedora

AudioBook.M4B -> 001.M4A, 002.M4A ...

Сообщение alkesta »

Есть ряд книг в M4B. Автомобиль не хочет воспроизводить, подозреваю, что дело в размере. Хотелось бы порезать файл на главы с сохранением метаинформации.

Исходный файл:

Код: Выделить всё

$ ffmpeg -i Жизнь_Пи.m4b
ffmpeg version 0.8.12, Copyright (c) 2000-2011 the FFmpeg developers
--------------------------------cut------------------------------------
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.m4b':
  Metadata:
    major_brand     : M4A
    minor_version   : 0
    compatible_brands: M4A mp42isom
    creation_time   : 2009-09-11 08:20:42
    encoder         : SSA (Slideshow Assembler) version 1.0.5a
    title           : Жизнь Пи
    artist          : Янн Мартел
    album_artist    : Янн Мартел
    album           : Жизнь Пи
    genre           : Audiobook
    date            : 2003
    track           : 1
  Duration: 06:14:50.91, start: 0.000000, bitrate: 83 kb/s
    Chapter #0.0: start 0.000000, end 382.145000
    Metadata:
      title           : Часть 1. Торонто и Пондишери. Глава 1.
    Chapter #0.1: start 382.145000, end 428.058333
    Metadata:
      title           : Часть 1. Торонто и Пондишери. Глава 2.
    Chapter #0.2: start 428.058333, end 741.118333
    Metadata:
      title           : Часть 1. Торонто и Пондишери. Глава 3.
    Chapter #0.3: start 741.118333, end 1522.080000
    Metadata:
      title           : Часть 1. Торонто и Пондишери. Глава 4.
    Chapter #0.4: start 1522.080000, end 1882.056667
    Metadata:
      title           : Часть 1. Торонто и Пондишери. Глава 5.
    Chapter #0.5: start 1882.056667, end 1945.073333
    Metadata:
      title           : Часть 1. Торонто и Пондишери. Глава 6.
    Chapter #0.6: start 1945.073333, end 2375.025000
    Metadata:
      title           : Часть 1. Торонто и Пондишери. Глава 7.
  ---------------------------cut---------------------
    Chapter #0.97: start 20288.005000, end 20306.100000
    Metadata:
      title           : Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 98.
    Chapter #0.98: start 20306.100000, end 21247.040000
    Metadata:
      title           : Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 99. ч.1
    Chapter #0.99: start 21247.040000, end 22175.021667
    Metadata:
      title           : Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 99. ч.2
    Chapter #0.100: start 22175.021667, end 22490.916667
    Metadata:
      title           : Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 100.
    Stream #0.0(): Audio: aac, 44100 Hz, stereo, s16, 81 kb/s
    Metadata:
      creation_time   : 2009-09-11 08:20:42
    Stream #0.1(eng): Subtitle: text / 0x74786574, 0 kb/s
    Metadata:
      creation_time   : 2009-09-11 08:20:42

Порезать можно:

Код: Выделить всё

$ ffmpeg -i Жизнь_Пи.m4b -ss 741.118333 -t 780.961667 -map 0:0 -acodec copy /
-metadata title="Торонто и Пондишери. Глава 4." -metadata artist="Янн Мартел" -metadata album="Жизнь Пи" /
-metadata date="2003" -metadata genre="Audiobook" -metadata track="004" 004.m4a


Не силён в написании скриптов.

UPD: Осилил.
Скриптик ($ sh m4b_chaps.sh Жизнь_Пи.m4b) создает файл chapter.list, который можно отредактировать, если что:

Код: Выделить всё

$ cat m4b_chaps.sh
#!/bin/bash

  INPUTFILE="$1"

  ffmpeg -i "$INPUTFILE" 2>&1 | awk '/artist/ || /album/ || /genre/|| /date/' | sed 's/^[ \t]*//' | sed -e 's/[ \t]*\:/\:/g' > chapter.list
  ffmpeg -i "$INPUTFILE" 2>&1 | awk '/Chapter/,/title/' | awk '/Chapter/ || /title/' | sed 's/^[ \t]*//' | sed -e 's/[ \t]*\:/\:/g' >> chapter.list

Содержимое chapter.list:

Код: Выделить всё

$ cat chapter.list
artist: Янн Мартел
album_artist: Янн Мартел
album: Жизнь Пи
genre: Audiobook
date: 2003
Chapter #0.0: start 0.000000, end 382.145000
title: Часть 1. Торонто и Пондишери. Глава 1.
Chapter #0.1: start 382.145000, end 428.058333
title: Часть 1. Торонто и Пондишери. Глава 2.
Chapter #0.2: start 428.058333, end 741.118333
title: Часть 1. Торонто и Пондишери. Глава 3.
Chapter #0.3: start 741.118333, end 1522.080000
title: Часть 1. Торонто и Пондишери. Глава 4.
Chapter #0.4: start 1522.080000, end 1882.056667
title: Часть 1. Торонто и Пондишери. Глава 5.
Chapter #0.5: start 1882.056667, end 1945.073333
title: Часть 1. Торонто и Пондишери. Глава 6.
Chapter #0.6: start 1945.073333, end 2375.025000
title: Часть 1. Торонто и Пондишери. Глава 7.
Chapter #0.7: start 2375.025000, end 2989.056667
title: Часть 1. Торонто и Пондишери. Глава 8.
Chapter #0.8: start 2989.056667, end 3083.001667
title: Часть 1. Торонто и Пондишери. Глава 9.
Chapter #0.9: start 3083.001667, end 3162.145000
title: Часть 1. Торонто и Пондишери. Глава 10.
Chapter #0.10: start 3162.145000, end 3270.090000
title: Часть 1. Торонто и Пондишери. Глава 11.
Chapter #0.11: start 3270.090000, end 3346.061667
title: Часть 1. Торонто и Пондишери. Глава 12.
Chapter #0.12: start 3346.061667, end 3517.016667
title: Часть 1. Торонто и Пондишери. Глава 13.
Chapter #0.13: start 3517.016667, end 3573.035000
title: Часть 1. Торонто и Пондишери. Глава 14.
Chapter #0.14: start 3573.035000, end 3832.156667
title: Часть 1. Торонто и Пондишери. Глава 15.
Chapter #0.15: start 3832.156667, end 4301.005000
title: Часть 1. Торонто и Пондишери. Глава 16.
Chapter #0.16: start 4301.005000, end 5070.060000
title: Часть 1. Торонто и Пондишери. Глава 17.
Chapter #0.17: start 5070.060000, end 5271.043333
title: Часть 1. Торонто и Пондишери. Глава 18.
Chapter #0.18: start 5271.043333, end 5334.035000
title: Часть 1. Торонто и Пондишери. Глава 19.
Chapter #0.19: start 5334.035000, end 5421.076667
title: Часть 1. Торонто и Пондишери. Глава 20.
Chapter #0.20: start 5421.076667, end 5504.018333
title: Часть 1. Торонто и Пондишери. Глава 21.
Chapter #0.21: start 5504.018333, end 5541.068333
title: Часть 1. Торонто и Пондишери. Глава 22.
Chapter #0.22: start 5541.068333, end 5891.021667
title: Часть 1. Торонто и Пондишери. Глава 23.
Chapter #0.23: start 5891.021667, end 5944.026667
title: Часть 1. Торонто и Пондишери. Глава 24.
Chapter #0.24: start 5944.026667, end 6049.118333
title: Часть 1. Торонто и Пондишери. Глава 25.
Chapter #0.25: start 6049.118333, end 6205.158333
title: Часть 1. Торонто и Пондишери. Глава 26.
Chapter #0.26: start 6205.158333, end 6296.106667
title: Часть 1. Торонто и Пондишери. Глава 27.
Chapter #0.27: start 6296.106667, end 6364.158333
title: Часть 1. Торонто и Пондишери. Глава 28.
Chapter #0.28: start 6364.158333, end 6426.120000
title: Часть 1. Торонто и Пондишери. Глава 29.
Chapter #0.29: start 6426.120000, end 6501.128333
title: Часть 1. Торонто и Пондишери. Глава 30.
Chapter #0.30: start 6501.128333, end 6739.076667
title: Часть 1. Торонто и Пондишери. Глава 31.
Chapter #0.31: start 6739.076667, end 6835.026667
title: Часть 1. Торонто и Пондишери. Глава 32.
Chapter #0.32: start 6835.026667, end 6930.055000
title: Часть 1. Торонто и Пондишери. Глава 33.
Chapter #0.33: start 6930.055000, end 7002.035000
title: Часть 1. Торонто и Пондишери. Глава 34.
Chapter #0.34: start 7002.035000, end 7084.016667
title: Часть 1. Торонто и Пондишери. Глава 35.
Chapter #0.35: start 7084.016667, end 7233.068333
title: Часть 1. Торонто и Пондишери. Глава 36.
Chapter #0.36: start 7233.068333, end 7455.153333
title: Часть 2. Тихий океан. Глава 37.
Chapter #0.37: start 7455.153333, end 7710.076667
title: Часть 2. Тихий океан. Глава 38.
Chapter #0.38: start 7710.076667, end 7789.121667
title: Часть 2. Тихий океан. Глава 39.
Chapter #0.39: start 7789.121667, end 7978.138333
title: Часть 2. Тихий океан. Глава 40.
Chapter #0.40: start 7978.138333, end 8311.061667
title: Часть 2. Тихий океан. Глава 41.
Chapter #0.41: start 8311.061667, end 8431.053333
title: Часть 2. Тихий океан. Глава 42.
Chapter #0.42: start 8431.053333, end 8679.080000
title: Часть 2. Тихий океан. Глава 43.
Chapter #0.43: start 8679.080000, end 8763.155000
title: Часть 2. Тихий океан. Глава 44.
Chapter #0.44: start 8763.155000, end 8979.003333
title: Часть 2. Тихий океан. Глава 45.
Chapter #0.45: start 8979.003333, end 9259.111667
title: Часть 2. Тихий океан. Глава 46.
Chapter #0.46: start 9259.111667, end 9424.110000
title: Часть 2. Тихий океан. Глава 47.
Chapter #0.47: start 9424.110000, end 9590.115000
title: Часть 2. Тихий океан. Глава 48.
Chapter #0.48: start 9590.115000, end 9786.010000
title: Часть 2. Тихий океан. Глава 49.
Chapter #0.49: start 9786.010000, end 9946.035000
title: Часть 2. Тихий океан. Глава 50.
Chapter #0.50: start 9946.035000, end 10486.156667
title: Часть 2. Тихий океан. Глава 51.
Chapter #0.51: start 10486.156667, end 10523.001667
title: Часть 2. Тихий океан. Глава 52.
Chapter #0.52: start 10523.001667, end 11258.155000
title: Часть 2. Тихий океан. Глава 53.
Chapter #0.53: start 11258.155000, end 11417.090000
title: Часть 2. Тихий океан. Глава 54.
Chapter #0.54: start 11417.090000, end 11588.155000
title: Часть 2. Тихий океан. Глава 55.
Chapter #0.55: start 11588.155000, end 11633.038333
title: Часть 2. Тихий океан. Глава 56.
Chapter #0.56: start 11633.038333, end 11857.050000
title: Часть 2. Тихий океан. Глава 57.
Chapter #0.57: start 11857.050000, end 12143.021667
title: Часть 2. Тихий океан. Глава 58.
Chapter #0.58: start 12143.021667, end 12428.030000
title: Часть 2. Тихий океан. Глава 59.
Chapter #0.59: start 12428.030000, end 12545.111667
title: Часть 2. Тихий океан. Глава 60.
Chapter #0.60: start 12545.111667, end 13245.003333
title: Часть 2. Тихий океан. Глава 61.
Chapter #0.61: start 13245.003333, end 13552.153333
title: Часть 2. Тихий океан. Глава 62.
Chapter #0.62: start 13552.153333, end 13614.106667
title: Часть 2. Тихий океан. Глава 63.
Chapter #0.63: start 13614.106667, end 13676.061667
title: Часть 2. Тихий океан. Глава 64.
Chapter #0.64: start 13676.061667, end 13781.080000
title: Часть 2. Тихий океан. Глава 65.
Chapter #0.65: start 13781.080000, end 14013.105000
title: Часть 2. Тихий океан. Глава 66.
Chapter #0.66: start 14013.105000, end 14085.146667
title: Часть 2. Тихий океан. Глава 67.
Chapter #0.67: start 14085.146667, end 14153.040000
title: Часть 2. Тихий океан. Глава 68.
Chapter #0.68: start 14153.040000, end 14216.090000
title: Часть 2. Тихий океан. Глава 69.
Chapter #0.69: start 14216.090000, end 14257.165000
title: Часть 2. Тихий океан. Глава 70.
Chapter #0.70: start 14257.165000, end 14564.028333
title: Часть 2. Тихий океан. Глава 71.
Chapter #0.71: start 14564.028333, end 14797.016667
title: Часть 2. Тихий океан. Глава 72.
Chapter #0.72: start 14797.016667, end 14855.136667
title: Часть 2. Тихий океан. Глава 73.
Chapter #0.73: start 14855.136667, end 14978.115000
title: Часть 2. Тихий океан. Глава 74.
Chapter #0.74: start 14978.115000, end 14993.083333
title: Часть 2. Тихий океан. Глава 75.
Chapter #0.75: start 14993.083333, end 15047.103333
title: Часть 2. Тихий океан. Глава 76.
Chapter #0.76: start 15047.103333, end 15143.055000
title: Часть 2. Тихий океан. Глава 77.
Chapter #0.77: start 15143.055000, end 15272.053333
title: Часть 2. Тихий океан. Глава 78.
Chapter #0.78: start 15272.053333, end 15339.110000
title: Часть 2. Тихий океан. Глава 79.
Chapter #0.79: start 15339.110000, end 15481.126667
title: Часть 2. Тихий океан. Глава 80.
Chapter #0.80: start 15481.126667, end 15559.105000
title: Часть 2. Тихий океан. Глава 81.
Chapter #0.81: start 15559.105000, end 15667.138333
title: Часть 2. Тихий океан. Глава 82.
Chapter #0.82: start 15667.138333, end 15931.150000
title: Часть 2. Тихий океан. Глава 83.
Chapter #0.83: start 15931.150000, end 16249.120000
title: Часть 2. Тихий океан. Глава 84.
Chapter #0.84: start 16249.120000, end 16402.111667
title: Часть 2. Тихий океан. Глава 85.
Chapter #0.85: start 16402.111667, end 16637.028333
title: Часть 2. Тихий океан. Глава 86.
Chapter #0.86: start 16637.028333, end 16718.098333
title: Часть 2. Тихий океан. Глава 87.
Chapter #0.87: start 16718.098333, end 16822.005000
title: Часть 2. Тихий океан. Глава 88.
Chapter #0.88: start 16822.005000, end 17039.038333
title: Часть 2. Тихий океан. Глава 89.
Chapter #0.89: start 17039.038333, end 17659.101667
title: Часть 2. Тихий океан. Глава 90.
Chapter #0.90: start 17659.101667, end 17763.118333
title: Часть 2. Тихий океан. Глава 91.
Chapter #0.91: start 17763.118333, end 19913.096667
title: Часть 2. Тихий океан. Глава 92.
Chapter #0.92: start 19913.096667, end 19961.028333
title: Часть 2. Тихий океан. Глава 93.
Chapter #0.93: start 19961.028333, end 20164.028333
title: Часть 2. Тихий океан. Глава 94.
Chapter #0.94: start 20164.028333, end 20247.043333
title: Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 95.
Chapter #0.95: start 20247.043333, end 20282.025000
title: Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 96.
Chapter #0.96: start 20282.025000, end 20288.005000
title: Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 97.
Chapter #0.97: start 20288.005000, end 20306.100000
title: Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 98.
Chapter #0.98: start 20306.100000, end 21247.040000
title: Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 99. ч.1
Chapter #0.99: start 21247.040000, end 22175.021667
title: Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 99. ч.2
Chapter #0.100: start 22175.021667, end 22490.916667
title: Часть 3. Больница Бенито Хуарес, Томатлан, Мексика. Глава 100.


Далее надо запустить кодирование ($ sh m4b_split.sh Жизнь_Пи.m4b) с учетом данных из chapter.list:

Код: Выделить всё

$ cat m4b_split.sh
#!/bin/sh

TRACK=0
READY=false
INPUTFILE="$1"

ARTIST=`cat chapter.list | awk '/artist:/' | sed '/album_artist:/d' | sed 's/artist: //'`
ALBUM_ARTIST=`cat chapter.list | awk '/album_artist:/' | sed 's/album_artist: //'`
ALBUM=`cat chapter.list | awk '/album:/' | sed '/album_artist:/d' | sed 's/album: //'`
GENRE=`cat chapter.list | awk '/genre:/' | sed 's/genre: //'`
YEAR_DATE=`cat chapter.list | awk '/date:/' | sed 's/date: //'`

ffmpeg -i "$INPUTFILE" -acodec copy audiostream.aac

mkdir "$ARTIST - $ALBUM"


while read LINE; do
  if [[ "$LINE" == *title* ]]; then
      TRACK=$(( $TRACK + 1))
      OUTFILE=`printf '%03d\n' "$TRACK"`
      READY=true
      TITLE=`echo $LINE | awk '/title:/' |  sed 's/title: //'`
  else
      READY=false
  fi

  if [[ "$LINE" == *Chapter* ]]; then
      START_POS=`echo $LINE | awk '/Chapter/ {print $4}' | sed 's/,*$//'`
      END_POS=`echo $LINE | awk '/Chapter/ {print $6}'`
      DURATION=`echo "$END_POS $START_POS" | awk '{print $1 - $2}'`
  fi

  if [[ "$READY" == true ]]; then
      ffmpeg -i audiostream.aac -ss "$START_POS" -t "$DURATION" -acodec copy -absf aac_adtstoasc \
      -metadata title="$TITLE" -metadata artist="$ARTIST" -metadata album="$ALBUM" \
      -metadata date="$YEAR_DATE" -metadata genre="$GENRE" -metadata track="$TRACK" \
      "./$ARTIST - $ALBUM/$OUTFILE.m4a" </dev/null

  fi

done < chapter.list

rm audiostream.aac
echo "Done!"


Скрипт создает файлы 001.m4a, 002.m4a.... 100.m4a на основе метаинформации из chapter.list, т.е. по главам.


Ну и объединённый вариант первого и второго скрипта (не предусматривающий редактирование chapter.list) в варианте для получения mp3 ($ sh sh m4b_splitter.sh file.m4b):

Код: Выделить всё

#!/bin/sh

INPUTFILE="$1"

ffmpeg -i "$INPUTFILE" 2>&1 | awk '/artist/ || /album/ || /genre/|| /date/' | sed 's/^[ \t]*//' | sed -e 's/[ \t]*\:/\:/g' > chapter.list
ffmpeg -i "$INPUTFILE" 2>&1 | awk '/Chapter/,/title/' | awk '/Chapter/ || /title/' | sed 's/^[ \t]*//' | sed -e 's/[ \t]*\:/\:/g' >> chapter.list


TRACK=0
READY=false


ARTIST=`cat chapter.list | awk '/artist:/' | sed '/album_artist:/d' | sed 's/artist: //'`
ALBUM_ARTIST=`cat chapter.list | awk '/album_artist:/' | sed 's/album_artist: //'`
ALBUM=`cat chapter.list | awk '/album:/' | sed '/album_artist:/d' | sed 's/album: //'`
GENRE=`cat chapter.list | awk '/genre:/' | sed 's/genre: //'`
YEAR_DATE=`cat chapter.list | awk '/date:/' | sed 's/date: //'`

mkdir "$ARTIST - $ALBUM"

exec 7<chapter.list;

while read -u7 LINE; do

  if [[ "$LINE" == *title* ]]; then
      TRACK=$(( $TRACK + 1))
      OUTFILE=`printf '%03d\n' "$TRACK"`
      READY=true
      TITLE=`echo $LINE | awk '/title:/' |  sed 's/title: //'`
  else
      READY=false
  fi

  if [[ "$LINE" == *hapter* ]]; then
      START_POS=`echo $LINE | awk '/Chapter/ {print $4}' | sed 's/,*$//'`
      END_POS=`echo $LINE | awk '/Chapter/ {print $6}'`
      DURATION=`echo "$END_POS $START_POS" | awk '{print $1 - $2}'`
  fi

  if [[ "$READY" == true ]]; then
      ffmpeg -i "$INPUTFILE" -ss "$START_POS" -t "$DURATION" -sn -acodec libmp3lame \
      -metadata title="$TITLE" -metadata artist="$ARTIST" -metadata album="$ALBUM" \
      -metadata date="$YEAR_DATE" -metadata genre="$GENRE" -metadata track="$TRACK" \
      "./$ARTIST - $ALBUM/$OUTFILE.mp3"
  fi

done

rm chapter.list
echo "Done!"

Для себя вопрос решил. Книги проигрываются, теги отображаются.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали: