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

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

10 августа 2010 г.

Cтруктура mpeg4

MP4Box неправильно прописывал некоторые параметры субтитров при конвертировании видео для iPhone (статья). Можно было использовать Dumpster Atom Inspector для ручного редактирования нужных полей, но я хотел написать скрипт который делает все автоматически.

Файл формата MPEG4 (будь то .mov, .mp4 или .m4v) состоит из блоков, называемых атомами. Каждый атом имеет формат:
- байты 0-3 - длинна атома (включая эти 4 байта)
- байты 4-7 - имя атома (четырехсимвольная строка, выделенная строка на рисунке)
- байты 8-… - данные атома



Вот из таких атомов и состоит MPEG4 файл. В каждом видео файле должны присутствовать атомы с именами "ftyp", "moov" и "mdat".

В "ftyp" содержится тип этого файла и типы версий основных структур файла. Этот атом всегда первый в файле. Атом "mdat" содержит потоки видео, аудио, субтитров. Атом "moov" для меня был самым интересным, так как он содержит описание треков, информацию о тегах.

Данные атома "moov" (то что начинается с 8-го байта) имеют древовидную структуру состоящих из блоков такого-же формата что и атом (т.е. 4 байта - размер блока, 4-байта - имя блока, с 8-го байта - данные). Формат блока отределяет эго имя, например блок с именем "mvhd" занимает 108 байт, и понять, что там записано не составит труда посмотрев на содержимое этой секции в Atom Inspector.



Кстати о размере блоков, как я понимаю они записаны в "человеческом" виде, т.е. чем байт старше, тем он левее, в компьютере числа представлены в "перевернутом" виде - чем старше байт, тем он правее. Учтите это при получении размеров атомов.

Так же в атоме "moov" -> "udata" -> "meta" содержится информация о тегах iTunes (обложка фильма включительно). Каждый тег в этом блоке так-же представлен блоком формата атом.

Скрипт на Python который печатает структуру MPEG4 файла.

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 файла