LINUX.ORG.RU

Как быстро можно получить индекс из AVI/MKV/WMV?

 ,


0

2

Нужно получить оффсеты/размеры кадров внутри контейнера (для быстрого seek внутри видеоредактора)

По идее, берем ffmpeg, получаем указатель на AVStream, а дальше перебираем index_entries и вроде все хорошо. Это работает для AVI или скажем MP4. А вот для матрешки или WMV это или вообще не работает, или дает только 1 стартовый кадр.

В принципе, это можно сделать последовательным чтением всех пакетов, но это слишком медленно. Медленно за счет IO, примерно 1 минута на 1 гигабайт файла. Многие видеоредакторы при открытии файла строят свой индекс подобным образом, но... Зачем, если внутри файла уже есть готовый индекс? К примеру, можно было бы открыть индекс из WMV чтобы получить все нужное.

в mkv можно почитать один из атомов, в котором хранятся таблицы кейфреймов.

mp4, конечно, лучше всех, самый толковый формат в этом плане.

Позорный wmv/avi —  не знаю

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

В них тоже с индексами все нормально. Внутри AVI есть 2 типа индексов, обычные idx1 чанки и «продвинутые» ix*. Внутри WMV с этим немного хуже, там оффсеты на кейфреймы. Вопрос в том - как это читать? Сделать свою либу?

Забавно, что index_entries содержит ключи для mpg, чем я был очень удивлен.

ruzisufaka
() автор топика
Ответ на: комментарий от max_lapshin

Самый толковый?

Я не проверял, но вот тут утверждают

Да, в случае MP4 процедура финализации файла прыгает в заголовок и там записывает критичные для проигрывания метаданные. Это специфика формата MP4.

Т.е. пока не запишешь файл до самого конца, заголовок невалиден. Не очень надёжно, я бы сказал. Лучше, мне кажется, иметь связный список, который после каждой дозаписи остаётся рабочим, даже если последние кадры недозаписаны/оборваны, таким образом теряя только хвост видео.

gag ★★★★★
()
Ответ на: комментарий от gag

зато в mp4 можно прочесть заголовок (менее 1% от всего объёма файла) и получить инфу о всём файле.

Что бы получить такую инфу о mkv, надо пролистать весь файл. Если он на HTTP хранилище, то по факту надо скачать весь файл.

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

Если он на HTTP хранилище...

...то надо держаться подальше от веб-обезьян, которые такое придумали, возможно сменить место работы

ruzisufaka
() автор топика
Ответ на: комментарий от ruzisufaka

Боюсь, что ты наверное немного не в курсе, как строятся распределенные системы.

Когда данные хранятся в одном месте, а вещать надо на другом континенте, то HTTP здесь оптимальный способ передачи данных.

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

Что бы получить такую инфу о mkv, надо пролистать весь файл. Если он на HTTP хранилище, то по факту надо скачать весь файл.

А есть где-то пример (на си), как выглядит это листание? Интересует: можно считать какую-то метку, данные, а потом прыгнуть к следующей метке с данными, и сколько минимум надо считать в итоге.

Просто HTTP поддерживает уже давным давно возможность указать офсет и размер необходимой инфы, так что если нужны маленькие кусочки, и самое позжее после загрузки очередного куксочка становится известно, откуда грузить следующий, то и HTTP - не преграда. Эта фича - именно то, что используется для докачки.

gag ★★★★★
()
Ответ на: комментарий от max_lapshin

то HTTP здесь оптимальный способ передачи данных.

Интересно, что за файловые сервер имеют ввиду сами создатели матрёшки:

Matroska having a small overhead, it is well suited for storing music/videos on file servers without having a big impact on the bandwidth used. It doesn't require to load the index before playing (the index can be loaded only when seeking is requested the first time), so playback can start very quickly too.

И индекс можно как-то подгрузить.

gag ★★★★★
()
Ответ на: комментарий от gag

смотри: что бы получить вообще всю информацию о mp4 файле достаточно прочесть первый килобайт, найти из него информацию о moov атоме. Он либо в начале, либо в конце.

Т.е. скорее всего в два HTTP запроса можно вытащить всю нужную информацию о каждом фрейме.

С mkv надо полистать чанки, а это может быть много сотен HTTP запросов, если индекс в конце и потом найти индекс. Неудобно, если честно.

max_lapshin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.