Начнём с обработки видео. Я беру второй сезон Декстера. Да, я списал его из торрентов, но угрызений совести по этому поводу не чувствую.

Файлы идут с внешними субтитрами SRT (русскими и английскими). В видео встроена русская звуковая дорожка, и отдельно идёт английская дорожка в формате AC3.

Конвертация видео под iPad и iPhone

Не скажу, что я обрабатываю видео оптимально, что нельзя сделать лучше/быстрее, или что ffmpeg оптимальнее Handbrake. Меня устраивает вполне мой метод. И хоть каждый файл конвертируется очень даже неторопливо, но если оставить скрипт с десятком файлов на ночь, то всё вполне нормально.

$ ffmpeg -y -i Dexter.S02E01.avi -threads 0 -s 720x400 -aspect 720:400 \
  -r 29.97 -vcodec libx264 -b 1000k -qmin 20 -qmax 50 -bufsize 10221k \
  -maxrate 1800k -acodec libfaac -ar 44100 -ac 2 -ab 128k -f ipod \
  -coder 1 -flags +loop -cmp +chroma \
  -partitions +parti8x8+parti4x4+partp8x8+partb8x8 -me_method umh -subq 8 \
  -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 \
  -b_strategy 2 -qcomp 0.6 -qdiff 4 -bf 3 -refs 4 -directpred 3 -trellis 1 \
  -flags2 +wpred+mixed_refs+dct8x8+fastpskip+mbtree -wpredp 2 \
  Dexter.S02E01.m4v

Расписывать опции не буду - это тема для отдельной статьи.

Преобразование звуковой дорожки AC3 в AAC

$ ffmpeg -i Dexter.S02E01.ENG.ac3 -acodec libfaac -ar 44100 -ac 2 -ab 128k \
  -threads 0 Dexter.S02E01.ENG.aac

Извлечение звуковой дорожки из видеофайла

Эта операция избыточна - можно было бы ограничиться тем, что после конвертации видео на первом шаге звуковая дорожка и так встроена в нормальном формате. Но для того, чтобы алгоритм был универсальным, я извлеку эту дорожку из файла по рецепту, описанном в предыдущей статье:

$ ffmpeg -i Dexter.S02E01.m4v
Stream #0.0(und): Video: h264, yuv420p, 720x400 [PAR 1:1 DAR 9:5], 937 kb/s, 29.97 fps, 29.97 tbr, 2997 tbn, 59.94 tbc
Stream #0.1(eng): Audio: aac, 44100 Hz, stereo, s16, 124 kb/s

$ ffmpeg -i Dexter.S02E01.m4v -map 0:1 -acodec libfaac -ar 44100 -ac 2 \
  -ab 128k -threads 0 Dexter.S02E01.RUS.aac

Склейка

Все файлы готовы:

-rw-r--r--   1 ctrld  staff      56970 Apr 26 13:05 Dexter.S02E01.ENG.srt
-rw-r--r--   1 ctrld  staff   51175034 Apr 26 12:21 Dexter.S02E01.RUS.aac
-rw-r--r--   1 ctrld  staff      65149 Apr 26 13:05 Dexter.S02E01.RUS.srt
-rw-r--r--@  1 ctrld  staff  529523256 Apr 26 13:15 Dexter.S02E01.m4v

Для работы с дорожками понадобится Subler (бесплатный редактор для слияния треков).

Для начала желательно убрать все треки, кроме видео из файла:

Далее добавляем все нужные дорожки, проставляем языки:

После нажатия на Save некоторые дорожки пометятся как "Not Enabled", поэтому их нужно включить и записать по-новому:

После записи файла на iPhone (формат для iPad идёт и на iPhone) ни один дополнительный трек (кроме основной аудиодорожки) недоступен:

Корректировка флагов в файле

Вдумчиво читаем статью "[FAQ] Создание видео для iPhone с несколькими звуковыми дорожками, субтитрами и главами", а именно Часть 5, "Короткий вариант работы в Dumpster от kernalas".

Видеофайл, собранный обычными утилитами типа Subler, содержит неправильные флаги, из-за чего iPhone/iPad не видит дополнительные треки. Для их корректировки используется Dumpster. Хорошая новость - он есть под Mac OS X Dumpster for Macintosh. Плохая - я не смог его заставить работать, он устанавливал флаги тоже неправильно (вместо 00000f ставил 0f0000) и файлы даже не добавлялись в iTunes. Поэтому пришлось использовать Windows-версию Dumpster (ссылка есть в Части 1), которую я запускал под Win XP в виртуальной машине.

Нужно выполнить рекомендации, описанные в Части 5, "Короткий вариант работы", а именно для звуковых дорожек и сабтитров поменять поля Flags и Alternate Group:

Открываем сборку в Dumpmaster

  1. Audio1:
    1. Проверяем аудио у нас или нет? 'moov' > 'trak' > 'mdia' > 'hdlr' > Component subtype: 'soun'
    2. 'moov' > 'trak' > 'tkhd' > Flags: $00000f
    3. 'moov' > 'trak' > 'tkhd' > Alternate Group: $0001
  2. Audio2:
    1. 'moov' > 'trak' > 'mdia' > 'hdlr' > Component subtype: 'soun'
    2. 'moov' > 'trak' > 'tkhd' > Flags: $00000e
    3. 'moov' > 'trak' > 'tkhd' > Alternate Group: $0001
  3. Subtitle1:
    1. 'moov' > 'trak' > 'mdia' > 'hdlr' > Component subtype: 'text' заменяем на 'sbtl'. Код: $7362746c
    2. 'moov' > 'trak' > 'tkhd' > Flags: $00000f
    3. 'moov' > 'trak' > 'tkhd' > Alternate Group: $0002
  4. Subtitle2:
    1. 'moov' > 'trak' > 'mdia' > 'hdlr' > Component subtype: 'text' заменяем на 'sbtl'. Код: $7362746c
    2. 'moov' > 'trak' > 'tkhd' > Flags: $00000e
    3. 'moov' > 'trak' > 'tkhd' > Alternate Group: $0002

По умолчанию (f) - одна, альтернативных (е) - сколько угодно, т.е. галочка в свойствах фильма в QT равна "f" в dumpster-е.

Всё выглядит запутанно, но после нескольких минут становится всё понятно:

После этого шаманства файл перегоняется в iTunes, затем на iPhone, и наконец-то появляются все звуковые дорожки и субтитры:

Само собой, субтитры "soft", т.е. отключаемые:

Для завершения покажу информацию по дорожкам файла:

$ ffmpeg -i Dexter.S02E01.m4v
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Dexter.S02E01.m4v':
  Metadata:
    major_brand     : M4V
    minor_version   : 512
    compatible_brands: isomiso2avc1
    encoder         : Lavf52.56.0
  Duration: 00:53:35.17, start: 0.000000, bitrate: 1317 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x400 [PAR 1:1 DAR 9:5], 937 kb/s, 29.97 fps, 29.97 tbr, 2997 tbn, 59.94 tbc
    Stream #0.1(eng): Audio: aac, 44100 Hz, stereo, s16, 124 kb/s
    Stream #0.2(rus): Audio: aac, 44100 Hz, stereo, s16, 125 kb/s
    Stream #0.3(eng): Subtitle: tx3g / 0x67337874, 0 kb/s
    Stream #0.4(rus): Subtitle: tx3g / 0x67337874, 0 kb/s

Метатеги

Я не рассматриваю правильное прописывание метатегов, это вопрос для отдельной статьи. Есть программы, которые сами всё прописывают. Например, есть платная программа iFlicks, которая кроме конвертации видео (но без изысков вроде нескольких звуковых дорожек) берёт метаданные где-то в Интернет. Но можно прописать всё и бесплатно, через iTunes.