ffmpeg - получение информации о фильме, извлечение дорожек, декодирование
mkvtools - получение информации о фильме, извлечение дорожек
MP4Box - собирание дорожек в m4v в файл
AtomicParsley - пропитывание тэгов
Алгоритм работы:
1. Извлекаем информацию о видео-файле
используем ffmpeg:
- $ ffmpeg -i <file_name>
ffmpeg не выводит тип субтитров (ASS/SRT), поэтому если тип файла видео mkv используем утилиту mkvinfo:
- $ mkvinfo <file_name>
2. Вычисляем конечного разрешение видео. Дело в том, что разрешение видео для iPhone что по вертикали, что по горизонтали должно быть кратно 16. Мы же будем привязывать разрешение к размеру экрана:
- # код на Python, переменные w,h - разрешение исходного видео ролика, _w, _h - разрешение финального видео
- _w = 480 # ширина будет равна ширине экрана
- _h = (h*_w)/w # вычисляем высоту
- tmp = _h%16
- if _h%16>7: # округляем высоту до ближайшего числа кратного 16
- _h += 16-_h%16
- else:
- _h -= _h%16
3. Конвертируем видео используя ffmpeg (используем двухпроходное кодирование), как собрать ffmpeg c поддержкой x264 я описывал здесь:
- $ 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
Все хорошо кодируется если исходная аудио дорожка в стерео:
- $ ffmpeg -y -i <input_video> -map 0.1 -vn -acodec libfaac -ab 128k -ac 2 -ar 44100 <out_audio>.aac
если же аудио каналов больше то прогоняем через промежуточный файл:
- $ ffmpeg -y -i <input_video> -map 0.1 -vn -acodec ac3 -ab 448k -ar 44100 -ac 6 ./tmp.ac3
- $ ffmpeg -y -i ./tmp.ac3 -vn -acodec libfaac -ab 128k -ar 44100 -ac 2 <out_audio>.aac
есть лучше вариант:
- $ 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:
- $ 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 файла