Pure AVCHD demuxer

Apr 27, 2009 18:35

Представляю собственный демуксер M2TS файлов с AVCHD камер и Blu-Ray дисков.
Утилита обладает рядом достоинств и имеет определенные удобства в плане работы именно с AVCHD материалом.

Ранее я писал о различных способах ремукса M2TS видео с AVCHD камеры в Матрешку (MKV) без пережатия.

Для мукса элементарных потоков в MKV предлагалось использовать mkvmerge, для извлечения элементарных потоков из M2TS файлов - eac3to или tsMuxer или xport.
Если честно, ни одна меня до конца не удовлетворила.

Очень важный момент - склейка нескольких сцен расположенных в разных M2TS (MTS) файлах в один.

Это уже умеют делать eac3to и tsMuxer, но механизм не очень удобен (особенно в GUI варианте tsMuxer).

После беглого изучения вопроса выяснилось что без опасений это можно сделать при помощи команды 'copy /b' (windows) или 'cat' (*nix), т.е. просто дописываем один файл в конец другого.

На практике это не лучшая идея. Дело в том, что в каждом M2TS файле звук и видео могут различаться по длине. Это актуально для NTSC камер с дробными FPS, например, 29.97. Длительность (fps) аудио (AC3) и видео фреймов (h.264 JVT NAL) не может быть произвольной, поэтому четко свести их в конце TS потока не получается. Проще всего подогнать видео к звуку, для этого нужен переменный fps. В результате получаем аудио поток, как вариант, на 1мс длиннее видео.
Не трудно подсчитать что для 100 сцен мы получим отставание звука уже на 100мс к последней.

Когда мы смотрим M2TS файлы один за другим, плеер каждый раз начинает с самого начала и проблем с синхронизацией нет. Если же мы клеим файлы, извлекаем оттуда элементарные потоки и позднее муксим их в MKV мы полностью теряем информацию для синхронизации. Муксер (mkvmerge) ничего не знает об изначальных свойствах TS потока и расставляет собственные временные метки, считая звук и видео синхронными (напомню, элементарный поток h.264 вообще не содержит метаданных о FPS и т.п).

Переходим к фичам программы:
- Работает под Windows и Linux, исходные тексты открыты;
- Понимает M2TS и TS файлы (определение типа магической последовательности);
- Обработка нескольких клипов за один вызов;
- Склейка нескольких потоков в один;
- Демукс в ES или PES;
- Расширения выходным файлам назначает в зависимости от типа элементарного потока;
- Принимает список файлов и/или список директорий в командной строке (можно просто указать путь к файлам, например, private/avchd/bdmv/stream, программа возьмет оттуда все подходящие файлы сама);
- Умеет извлекать информацию о дате и времени съемки каждого ролика из mpls файлов в камере (private/avchd/bdmv/playlist/*.mpl)
- Может извлекать элементарные потоки всех программ в TS контейнере или выборочно по номеру;
- Формирует файлы с таймкодами для правильной синхронизации элементарных потоков (формат mkvmerge);
- Определяет частоту кадров анализируя h.264 и AC3 потоки;
- Определяет задержку звука относительно видео в каждом файле и вносит соответствующие поправки в таймкоды (актуально для Blu-Ray, не нужно определять и указывать задержку самому при муксе в MKV);
- Старается выравнивать окончание элементарных потоков в рамках каждой сцены;
- Формирует файл со сценами для сохранения информации об изначальном делении материала на множество M2TS файлов, в качестве названия сцены используется имя файла либо дата/время съемки из плейлиста (формат mkvmerge);
- Формирует SRT файл с титрами содержащими текущую дату/время съемки (с секундами);
- Показывает команду вызова mkvmerge для мукса полученного материала в MKV;
- Знает следующие типы элементарных потоков: MPEG2 Video, MPEG2 Audio, H.264, VC-1, AC3, L-PCM;
- Умеет парсить и отображать информацию о TS потоке без извлечения элементарных потоков (отображает типы, продолжительность, смещение и fps потоков);
- Отображение структуры TS/M2TS потоков (PTS/DTS, M2TS таймкоды и т.д.).

К сожалению пока только консольный вариант.
Тестировал только с AVCHD камерами Canon, Sony и Panasonic, пробовал несколько Blu-Ray дисков и вещательных TS потоков.

Недостатки конкурентов:
- xport: Не умеет клеить файлы и не берет TS со стандартного ввода. Имена выходных файлов не отражают типа содержимого;
- eac3to: Нет исходников, только под винду;
- tsMuxer: Нет исходников, не очень удобно пользоваться консольной версией, в GUI не удобно клеить файлы.

Кроме того, никто из них не формирует файлы для правильной синхронизации потоков в mkvmerge, никто из них не генерирует файл со списком сцен, никто из них не извлекает дату и время съемки материала.

Позиционирую программу как альтернативу xport.

Сборка под WIndows (win32): tsdemuxer.googlecode.com/files/tsdemux.zip
Инсталляшка GUI под Windows (win32): tsdemuxer.googlecode.com/files/tsdemuxer_setup.exe (если есть проблемы с запуском - качаем Microsoft Visual C++ 2008 Redistributable Package отсюда)
Сборка под Linux (gcc 4, static): tsdemuxer.googlecode.com/files/tsdemux.tar.gz
Тут исходники: code.google.com/p/tsdemuxer/source/browse/trunk/v1.5
Домашняя страница проекта: code.google.com/p/tsdemuxer

Простейшая форма вызова: 'tsdemux.exe -m -j -c 1 -d x:\private\avchd\bdmv\stream' или 'tsdemux.exe -j -c 1 00001.mts 00002.mts'.
В текущей директории получаем 5 файлов: аудио поток, видео поток, tmc-файл для аудио, tmc-файл для видео, xml-файл со сценами. Все это скармливается mkvmerge.

Опции командной строки:
tsdemux.exe [-d src] [-l mpls] [-o dst] [-c channel] [-u] [-j] [-m] [-z] [-p] [-e mode] [-v] *.ts|*.m2ts ...

-d Обрабатывает все TS/M2TS/MTS файлы из указанной директории (ключ можно использовать много раз для разных директорий, файлы сортируются по возрастанию). Для AVCHD/Blu-Ray носителя это обычно 'private/avchd/bdmv/stream').
-l Путь к файлу AVCHD/Blu-Ray плейлиста (обычно 'private/avchd/bdmv/playlist/*.mpls'). Если указать, то обрабатываться будут только клипы из плейлиста в соответствующем порядке. Кроме того, в качестве названия сцен будет использована дата/время съемки (только для AVCHD камер).
-o Перенаправляет вывод в другую директорию (по умолчанию текущая).
-c Номер программы в TS потоке (если не указывать будут извлечены все потоки всех программ, но файл сцен для mkvmerge формироваться не будет).
-u Извлекать неизвестные потоки (субтитры и т.п.).
-j Объединять несколько клипов в один с генерацией фиалов синхронизации для mkvmerge.
-m Заставляет программу показать опции вызова mkvmerge для мукса результата в MKV.
-z Извлекает PES потоки.
-p Запрещает извлечение элементарных потоков, только анализ с выводом информации на стандартный вывод.
-e Выводит на стандартный вывод информацию о структуре TS потока (mode=1: отображает M2TS таймкоды, mode=2: отображает PTS/DTS, mode=3: отображает PTS/DTS в читабельном виде).
-v Расширенный вывод.

Допустимые расширения входных файлов: m2ts, mts, ts.
В выходной директории ('-o') могут образоваться файлы с расширениями: sup, m2v, 264, vc1, ac3, m2a, pcm.
Кроме того, образуются файлы с таймкодами каждого элементарного потока для mkvmerge (tmc) и  файл со сценами mkvmerge (chapters.xml).

Багрепорты в комменты :)

Вот еще 2 моих Open Source проекта:
- ps3muxer.org
- luasp.org

видеомонтаж, программирование, avchd, обзор, софт

Previous post Next post
Up