Конференция "Media" » Создание и сжатие видео
 
  • Gedevan (15.10.15 17:37) [0]
    В моей программе формируются изображения в объектах TBitmap со скоростью как минимум 2 раза в секунду. Сейчас изображения приходят в программу и каждое новое заменяет предыдущее, т.е. они не хранятся.

    Так вот появилась задача сохранять все это на диск, чтобы потом можно было поверх этих картинок нарисовать отладочную информацию (она будет сохранятся на диск в отдельных файлах, рисовать ее сразу наверное будет затруднительно, да и это плохо скажется на скорости работы программы) и смотреть как видео. Период писания "видео" хотя бы часов 10.

    Я подошел к этому вопросу так, что после того как картинка сформирована, я копирую ее в array of integer   и через FileStream пишу на диск подряд эти массивы.

    У моего подхода есть недостаток, в связи с которым я и пришел сюда. За 8 часов записи (2 изображения в секунду) размер этого "видео" будет где то в районе 130 гб, что меня совсем не радует.

    И мой вопрос в том, какие есть возможности по сжатию этих картинок? (то есть компоненты или алгоритмы которые я могу включить в состав своей программы). Тут интересуют 2 варианта - сжатие прямо во время записи в файл и сжатие уже готового файла. Т.е. есть алгоритмы которые можно использовать в риалтайме?

    Почитав этот раздел увидел компонент TJpegImage - возможно ли с его помощью писать в риал тайме или он весьма долго сжимает (картинки 24 бита от 1024x768 размером и до 1920x1080)?

    И непонятный для меня момент еще -  в TBitmap я могу получить доступ к  изображению через Scanline, а можно ли как то выдрать сжатое изображение из TJpegImage? причем в удобоваримом виде, ведь я хочу на нем еще нарисовать отладочную информацию, или только обратной загрузкой в TBitmap?

    Также я сделал вариант в котором в файл сохраняется изображение в градации серого array of byte, полагаю от этого файл будет меньше в 4 раза. Существующие методы сжатия и TJpegImage могут дать большую экономию? Да и боюсь, что полная потеря цветов сделает видео неудобоваримым...поэтому перевод в серый цвет наверное не выход.

    И еще есть ли алгоритмы сжатия без потери качества? Т.к. режим сохранения изображений идентичных оригиналу тоже бы желателен, но это отдельная задача. Т.е. нужно 2 варианта с потерей и без.
  • Gedevan (15.10.15 18:23) [1]
    Еще нашел, что есть компонент AVIWriter2. Но вот вопрос - как он пишет? одной моей картинке будет соответствовать одна картинка в видео или он ее размножит чтобы получалось 24 кадра? (т.е. мне нужно чтобы было 1 к 1). Смогу ли я в этом файле получить доступ к каждому отдельному кадру? - задача максимум пририсовать отладочную информацию, задача минимум показывать нужный кадр (т.е. в отдельном файле я храню отладочную информацию и номер картинки к которой она относится, и с помощью фильтра отбираю ту отладочную информацию, которая меня интересует и хочу увидеть ту самую картинку, а не нипойми что) Можно ли этим компонентом такие задачи решить?
  • Gedevan (15.10.15 18:25) [2]
    и еще момент по поводу AVIWriter


    > Единственный нюанс: AVIWriter вызывает функции avifil32.
    > dll и MSVFW32.DLL


    эти библиотеки от винды? или они с делфи идут?
  • Gedevan (15.10.15 18:39) [3]
    да и модуля aviWriter_2 в XE5 что-то не наблюдается...
  • Gedevan (15.10.15 21:06) [4]
    не все....мне нужно только нечто чем можно сжать кадр, avi всякие не хочу собирать.
  • Gedevan (15.10.15 22:57) [5]
    в общем сжатие 1024 на 768 с помощью TJpegImage  занимает где то (вместе с копированием битмапа) 62-70 мс. И ужимает его он раз в 10 при качестве 75. На этом пока и остановился.
  • Pavia © (16.10.15 09:59) [6]
    Много чем можно:
    VFW  - устаревшая поддерживает только AVI, да и кодеков мало
    DirectX
    DSPack - обёртка над DirectX.
    FFVCL(FFMpeg)
    PasLibVlc

    Я бы на вашем месте сжимал нормальным кодеком. Межкадровое сжатие может дать ещё 2-10 раз.

    > в общем сжатие 1024 на 768 с помощью TJpegImage  занимает
    > где то (вместе с копированием битмапа) 62-70 мс. И ужимает
    > его он раз в 10 при качестве 75. На этом пока и оста

    По нынешнем меркам это медленно. Плюс поддержка параллельности под вопросом. Да и пользователю удобно когда есть выбор и он может ещё и свой кодек поставить.
  • Gedevan (16.10.15 16:52) [7]
    DSPack  я смотрел, но не нашел ничего что помогло бы мне хоть что то понять)

    а эти кодеки позволяют как TJpegImage  сжать покадрово, и потом разжать покадрово(без добавления лишних кадров)? чтобы я мог обратно получить свой кадр и нарисовать на нем?
  • Gedevan (16.10.15 21:04) [8]
    А кто нибудь может подсказать как можно применить DSPack к моей задаче?

    Я вообще не нашел примеров создания видео. А в примерах проигрывания после декомпрессора идет AVI Render который выведет видео на экран, что меня как то совсем не устраивает. Как получить доступ к кадру? Как получить нужный кадр из всей последовательности?
  • NeyroSpace (17.10.15 00:31) [9]
    В 2006 году я тоже задавал себе точно такие же вопросы)
    Почему примеры DSPack такие дурацкие (или для батонокидателей или сразу для гуру фильтров)? Почему описание DirectShow нигде не найти? И т.д...
    С тех пор ситуация не сильно изменилась. Я позволю себе описать процесс вашего будущего прозрения:
    1. В DSPack есть только один пример - как при помощи грабера получать кадры с устройства захвата. Но дальше DSPack не говорит, как сжать кадры. Куда их треклятых совать-то? Везде какие-то потоки, к которым с обычными кадрами не подступиться! (дальше идет процесс вырывания волос, проклятья и переключение на другой вид деятельности)
    2. Вспоминаем о VFW. Ищем информацию - ее нигде нет. Хэлп на сайте майкрософт очень скуден. Т.е. там даже толком не сказано в какой последовательности вызываются эти функции. Гугление скорее всего даст Vfw.pas (хедеры функций) и VideoCoDec.pas конвертированный из VirtualDub (с кучей ошибок). Если по упорствовать, то удастся начать сжимать и разжимать отдельные кадры. Но каждый кодек будет делать ваш лоб все выше и выше...
    3. В конце концов придется вернуться к DS. Если вы полюбопытствуете и загляните в BaseClass.pas, то увидите, что там есть функции для работы с отдельными кадрами и буферами. Но чтобы получить к ним доступ, надо создать фильтр, т.е. COM объект, т.е. повременить с DS.
    4. После того, как вы разберетесь с COM, вы вернетесь к DirectShow и скорее всего попадете на один известный сайт, где вывешен несколько корявый перевод майкрософтовского хелпа. Если вы работали с электроникой и понимаете что значит подтягивающий резистр (pull) на выходе у вас сразу в голове наступит просветление и вы скажите: Так ДиректШоу писал электронщик-железячник! Надо было прямо в первой строчке так и написать! OMG! Как все привычно, гениально и просто!
    Если вы не электронщик, то придется делать над собой усилие)
    5. После того, как вы поймете принцип работы цепочки фильтров, у вас появится 1 закономерный вопрос:
    я не собираюсь писать фильтр в виде отдельного COM объекта, мне не нужна эта фабрика, регистрация в ОС и т.д.! Мне нужно потихому создать фильтр внутри поей программы и так же тихо его прибить! Ну, почему примеры в DSPack такие дурацкие!?? Ну, почему нет такого маленького простенького примерчика под мою задачу? (заметьте, к тому времени вы уже будете почти гуру DS))))
    6. Еще полазив по инету, вы скорее всего в порыве беспомощности запостите вопрос здесь. Во всяком случае так было со мной и спасибо, что мне подсказали как это сделать. Хотя, ответ на этот каверзный вопрос успешно закэшировался в гугле и надеюсь вы его сразу найдете.
    7. Но даже научившись в легкую создавать фильтры, перехватывать кадры в цепочке, вы столкнетесь со следующей проблемой:
    задержки при захвате и задержки при воспроизведении у рендера.
    На этот вопрос ответа тут мне не дали, но я сам написал ответ, надеюсь он вам поможет.
    Походу вам придется исправить некоторые баги в DSPack и ... пожалуй все)

    И главное, все кто проходил этот путь нифига не выкладывают исправленные исходники и примеры) А ведь у каждого они есть, наработанные потом кровью и частью своего драгоценного времени))) А почему?
    Потому, что они наша прэлэсть)))
  • NeyroSpace (17.10.15 01:08) [10]
    Причем с сетевой библиотекой INDY10 точно такая же беда. К ней идут весьма слабые примеры с многочисленными ошибками. Сколько человек пытались перевести хэлп к Инди10, он даже на сайте Подгорецкого красовался, но внятного, подробного мануала никто так и не сделал. А все потому, что люди пытаются использовать ее на уровне обычного процедурного программирования, тогда как она многопоточная. Этого не понимает 99% новичков. Более, того, когда ты проникаешься глубинами Инди, понимаешь, что, например, у сервера нет такой необходимой фитчи как функция отказа от приема входящего соединения. Как же так у апи сокетов она есть, а в инди нет?! Но к тому моменту, ты уже способен сам ее дописать в исходниках. А сколько утечек памяти, с прямыми комментариями в исходниках just let it leak... Все это приходиться править и ведь никуда не выкладываешь)))
    Мне иногда кажется, что это такой тихий заговор профессионалов. Есть черта за которой идет темный тоннель, который каждый должен пройти в одиночестве, без посторонней помощи, только ты, исходники и мантры, а потом на выходе из тоннеля появляется профессионал.
    Этот тоннель отделяет JavaScriptщиков, 1Сников и т.д. от системных программистов. Возможно, так и должно быть? Это своего рода обряд посвящения и естественный отбор... Хотя конечно, своего потраченного времени очень жаль.

    Вот я думаю... если сейчас взять и выложить готовый рабочий пример для VFW на GitHub, будут ли новички идти через тоннель DirectShow? Или все повально вернуться к VFW, где будет все ясно и просто?........ Будет ли это медвежьей услугой? Понижу ли уровень развития будущих кадров?)))
  • Pavia © (18.10.15 13:19) [11]
    VFW, DirectX строились на сокрытии информации.
    Реализация была скрыта. Плюс дурацкая справка, не понятные аналоги. Там крутились большие деньги и сейчас крутятся. Все разработки MPEG были запатентованы. Каждый кто изобретал что-то старался скрыть от конкурентов.  


    > И главное, все кто проходил этот путь нифига не выкладывают
    > исправленные исходники и примеры) А ведь у каждого они есть,
    >  наработанные потом кровью и частью своего драгоценного
    > времени))) А почему?Потому, что они наша прэлэсть))

    Я могу написать. Только пусть мне за это заплатят. Я несколько лет изучал эту тр@хомудь.  
    Сейчас я считаю что я стал профессионалом. И могу быстро находить ответы на вопросы.
    На простые вопросы могу дать ответ на сложные не всегда. Так как нет желания трать своё время.


    > Вот я думаю... если сейчас взять и выложить готовый рабочий
    > пример для VFW на GitHub, будут ли новички идти через тоннель
    > DirectShow? Или все повально вернуться к VFW, где будет
    > все ясно и просто?........ Будет ли это медвежьей услугой?
    >  Понижу ли уровень развития будущих кадров?)))

    Выкладывать стоит. Даже свой могу выложить.
    А вообще мне всё хочется сделать аналого FFMpeg на Pascal'e или просто транслировать код. Но будет ли это полезно?
    FFMPeg изначально появился из кучи разрозненных проектов. На Pascal'e  нет ничего близко лежащего.
  • Pavia © (18.10.15 14:23) [12]

    > DSPack  я смотрел, но не нашел ничего что помогло бы мне
    > хоть что то понять)

    DSPack является обёрткой над DirectShow (DS). Ничем полезным не обладает.
    Что-бы понять справку на DirectShow надо понять ООП.
    Для этого есть хорошая книжка:
    Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж.-Приемы объектно-ориентированного проектирования (2001)
    Без прочтения этой книги не стоит даже и начинать изучать DS.
    COM наверно тоже надо изучить, но у меня пока до него руки не дошли.


    > А кто нибудь может подсказать как можно применить DSPack
    > к моей задаче?Я вообще не нашел примеров создания видео.

    DS - это высокоуровневое программирования и тут нужно приложить много усилий что-бы получить простое низкоуровневое.

    Вам нужен фильтр с интерфейсом источника видео, граф видеозахвата.
    К которому подключаешь фильтры источника и фильтр приемника.
    Пример с захватом с камеры есть. Есть пример создания своего фильтра PushSource Filter
    Их надо просто переделать. Только надо смотреть там могут быть ошибки.


    > А в примерах проигрывания после декомпрессора идет AVI Render
    > который выведет видео на экран, что меня как то совсем не
    > устраивает. Как получить доступ к кадру?

    Заменить фильтр захвата. К примеру на TSampleGrabber.
    Пример лежит в папке Demo\SampleGrabber


    > Как получить нужный кадр из всей последовательности?

    В DS - этого нет. Но можно установить время с какого начать воспроизведение. Так что можно пересчитать частоту кадров на нужный кадр.  И выполнить Seek(Time, Absolute).

    В VFW это проще
  • Gedevan (20.10.15 02:57) [13]
    спасибо за ответ. Я все понял. делаю на джипегах. А если мне за это кто нибудь заплатит, тогда я найму вас, вы сделаете мне на DirectShow ) Ради маленькой приблуды 3 года становится профессионалом, думаю это слишком )
  • Игорь Шевченко © (20.10.15 10:25) [14]

    > Сейчас я считаю что я стал профессионалом


    Ошибаешься
  • Gapal (25.11.15 02:16) [15]
    Удалено модератором
 
Конференция "Media" » Создание и сжатие видео
Есть новые Нет новых   [118457   +7][b:0][p:0.001]