Показаны сообщения с ярлыком MP4Box. Показать все сообщения
Показаны сообщения с ярлыком MP4Box. Показать все сообщения

24 января 2011 г.

Скрипт конвертирования видео для iPhone/iPod/iPad в Linux

Основано на моих предыдущих записях:
- "Установка ffmpeg и x264"
- "Конвертирование видео для iPhone/iPod Touch/ iPad с несколькими звуковыми дорожками и субтитрами"

Скрипт писался для личного использования, тестировался исключительно на системе Ubuntu Linux 9.10, 10.04 и 10.10. Но не вижу проблем с запуском на других *nix системах. Писалось для конвертирования серилов с поддержкой нескольких звуковых дорожек и субтитров.

Подготовка

Установка ffmpeg с поддержкой кодека x264

- Удаляем пакеты x264, libx264-dev, и ffmpeg если они были установлены:

  1. $  sudo apt-get purge ffmpeg x264 libx264-dev


- Если включено автообновление пакетов в системе, запрещаем обновлять пакет ffmpeg:
Если файл "/etc/apt/apt.conf.d/50unattended-upgrades" существует то прописываем в секцию "Package-Blacklist" пакет ffmpeg, если файла нет, создаем его:

  1. $ sudo echo -e "Unattended-Upgrade::Package-Blacklist {\n \"ffmpeg\";\n};" > /etc/apt/apt.conf.d/50unattended-upgrades


- Получаем зависимые пакеты необходимые для установки ffmpeg и x264:

  1. $ sudo apt-get update
  2. $ sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libmp3lame-dev libtheora-dev


- Устанавливаем x264 из исходников

  1. $ mkdir ~/src; cd ~/src
  2. $ git clone git://git.videolan.org/x264.git
  3. $ cd ./x264/
  4. $ ./configure
  5. $ make
  6. $ sudo checkinstall --fstrans=no --install=yes --pkgname=x264 --pkgversion "1:0.svn`date +%Y%m%d`-0.0ubuntu1" --default


- Устанавливаем ffmpeg с поддержкой кодека x264:

  1. $ cd ~/src
  2. $ svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
  3. $ cd ffmpeg/
  4. $ ./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libx264
  5. $ make
  6. $ sudo checkinstall --fstrans=no --install=yes --pkgname=ffmpeg --pkgversion "3:0.svn`date +%Y%m%d`-12ubuntu3" --default


- устанавливаем необходимые утилиты кодирования

  1. $ sudo apt-get install mkvtoolnix gpac atomicparsley mencoder


mkvtoolnix - для работы с mkv файлами, gpac - библиотека для работы с mpeg4, atomicparsley - утилита для прописывания тэгов видео, mencoder - сейчас не используется, в будущем будет использоваться для кодирования mkv segmented linked видео.

Скачиваем скрипт кодирования

  1. $ cd
  2. $ git clone git://github.com/derand/video2iDevice.git


Краткое описание файлов:
2iDevice.py - собственно сам скрипт конвертирования
subConverter.py - модуль конвертирования субтитров, можно использовать как скрипт конверта сабов в ttxt формат
mpeg4fixer.py - модуль исправления выходного видео (замена графического Dumpster)
mpeg4Viewer.py - скрипт показывает структуру mpeg4 файла

Настройка завершена, теперь использование.

  1. $ ~/video2iDevice/2iDevice.py <опции> <видео файлы> <опции>


Имя параметраТипОписание
-th[int]кол-во потоков, которые будет использовать ffmpeg для кодирования
-lang[str]языки потоков (трехбуквенные имена) в выходном файле разделенные ":", например: "jpn:jpn:rus:eng:rus"
-streams[str] использовать дорожки в файле (номера дорожек разделенные ":" первая дорожка имеет индекс 0, например "0:3:1"), по умолчанию кодируются все дорожки из видео-файла
-format[str]выходной формат. Может быть "mp4", "m4v" - по умолчанию
-TRACK_REGEX[srt]регулярное выражение для выделения номера эпизода из имени файла.
-track[int]номер эпизода (серии)
-tracks[int]кол-во эпизодов (серий)
-stream[int]указывает номер используемого потока для добавленных потоков аудио или субтитров (см -afile, -sfile)
-title[str]прописывает имена потоков для добавленных потоков аудио или субтитров (см -afile, -sfile)
-b[int]битрейд видео (640 по умолчанию)
-refs[int]кол-во ref-frames (2 по умолчанию)
-vq[int]разрешение выходного видео (класс). 1 - 480x*, 2 - *x320, 3 - максимальный из первых двух (по умолчанию)
-s[int]x[int]выходное разрешение, имеет более высокий приоритет над параметром -vq
-fdПрописать продолжительность видео равную продолжительности видео-дорожки
-ar[int]частота аудио (по умолчанию 48000)
-ab[int]битрейд аудио (по умолчанию 128k)
-afile[str]добавление дорожки аудио из внешнего файла. Путь задается от папки с исходным видео. В строке могут встречаться подстроки которые заменяются: "[NAME]" - заменяется на имя файла, "[2EID]" - на номер эпизода (серии). После этого параметра может идти параметр -title и -stream
-sfile[str]добавление дорожки субтитров из внешнего файла. Формат такой-же как и в параметре -afile.
-stik[str]Задать тип видео. Может бить 'Movie' - фильм, 'Music Video' - клип, 'TV Show' - ТВ шоу ... (подробнее: AtomicParsley --stik-list)
-TVShowName[str]Задать название сериала/фильма
-TVSeasonNum[str]Задать сезон (для сериалов)
-description[str]Задать описание (максимально 255 символов)
-year[str]Установить год
-artwork[str]Установить изображение обложки. Полный путь к файлу изображения.


Несколько примеров использования можете найти в инструкции на rutracker

31 июля 2010 г.

Конвертирование видео для iPhone/iPod Touch/ iPad с несколькими звуковыми дорожками и субтитрами

Конвертировать будем в систем Linux. Используемые утилиты:
ffmpeg - получение информации о фильме, извлечение дорожек, декодирование
mkvtools - получение информации о фильме, извлечение дорожек
MP4Box - собирание дорожек в m4v в файл
AtomicParsley - пропитывание тэгов

Алгоритм работы:
1. Извлекаем информацию о видео-файле
используем ffmpeg:

  1. $ ffmpeg -i <file_name>

ffmpeg не выводит тип субтитров (ASS/SRT), поэтому если тип файла видео mkv используем утилиту mkvinfo:

  1. $ mkvinfo <file_name>


2. Вычисляем конечного разрешение видео. Дело в том, что разрешение видео для iPhone что по вертикали, что по горизонтали должно быть кратно 16. Мы же будем привязывать разрешение к размеру экрана:

  1. # код на Python, переменные w,h - разрешение исходного видео ролика, _w, _h - разрешение финального видео
  2. _w = 480 # ширина будет равна ширине экрана
  3. _h = (h*_w)/w # вычисляем высоту
  4. tmp = _h%16
  5. if _h%16>7: # округляем высоту до ближайшего числа кратного 16
  6. _h += 16-_h%16
  7. else:
  8. _h -= _h%16


3. Конвертируем видео используя ffmpeg (используем двухпроходное кодирование), как собрать ffmpeg c поддержкой x264 я описывал здесь:

  1. $ ffmpeg -y -i <input_video> -an -vcodec "libx264" -b "600k" -s "<_w>x<_h>" -flags "+loop" -cmp "+chroma" -partitions "+parti4x4+partp8x8+partb8x8" -subq "5" -trellis "1" -refs "1" -coder "0" -me_range "16" -g "300" -keyint_min "25" -sc_threshold "40" -i_qfactor "0.71" -maxrate "300k" -bufsize "300k" -rc_eq "blurCplx^(1-qComp)" -qcomp "0.6" -qmin "15" -qmax "51" -qdiff "4" -level "30" <out_video>.mp4

в результате мы получили отдельно видео поток в <out_video>.mp4

4. Конвертируем аудио. Нам нужно получить стерео дорожку в формате AAC
Все хорошо кодируется если исходная аудио дорожка в стерео:

  1. $ ffmpeg -y -i <input_video> -map 0.1 -vn -acodec libfaac -ab 128k -ac 2 -ar 44100 <out_audio>.aac

если же аудио каналов больше то прогоняем через промежуточный файл:

  1. $ ffmpeg -y -i <input_video> -map 0.1 -vn -acodec ac3 -ab 448k -ar 44100 -ac 6 ./tmp.ac3
  2. $ ffmpeg -y -i ./tmp.ac3 -vn -acodec libfaac -ab 128k -ar 44100 -ac 2 <out_audio>.aac

есть лучше вариант:

  1. $ ffmpeg -y -i <input_video> -map 0.x -vn -acodec libfaac -ab 128k -ac 2 -ar 48000 -strict experimental <out.aac>


5. Извлекаем субтитры, если в формате SRT то хорошо, если в ASS - конвертируем в SRT

6. Собираем все наши дорожки в один файл M4V:

  1. $ MP4Box -add <out_video>.mp4 -add <out_audio1>.aac:lang=xxx:group=1 -add <out_audio2>:lang=xxx:disable:group=1 -add <out_subs1>.srt:group=2:lang=xxx -add <out_subs2>.srt:group=2:lang=xxx:disable <out_video>.m4v -new


7. MP4Box не правильно прописывает заголовки субтитров (alternativeGroup и subType), исправляем. В одном из следующих постов я расскажу о формате заголовка m4v файла.

8. Прописываем теги утилитой AtomicParsley

Скрипт который все это реализует я в общий доступ не выкладываю (он написан довольно криво, да и состоит в стадии тестирования), но если вы хотите, я могу его вым выслать с инструкцией по применению. Мой ящик

Так-же смотрите структуру MPEG4 файла