Добрый день!
Сразу отмечу что в вопросах видео программирования я абсолютный новичок, хотя программированием занимаюсь достаточно давно. Поэтому заранее прошу прощения если использую неправильные термины или не понимаю Ваши.
Итак, задача возможно покажется вам элементарной: написать программу-конвертер видео, используя кодеки.
Проблема в том что необходимо поддерживать:
а. поздние версии Windows, где, как мне известно (не из очень достоверных источников), нет DirectX (и DirectShow в частности)
b. на серверных станциях (Windows Server 2003, 2007), где установить DirectX просто не дадут.
Возникают следующие вопросы:
1. действительно ли вышесказанное верно, и после XP в винде нет DirectShow (то что идет с MEdia Player не в счет, так как на сервер поставить его не дадут точно, вопрос решенный и не мной)
2. как можно иначе использовать кодеки? Вариант: открывать их как ком-объекты, и использовать не встраивая в граф (насколько я понимаю граф растет из DirectShow). Возможно ли использовать их без графа напрямую направляя им информационные потоки (через интерфейсы)?
3. и вообще концептуальный вопрос: что есть DirectShow а что он не есть. Просто в двух словах: насколько будут работать COM-объекты графа, если принести этот объект "с собой" на машину без DirectX, какова взаимосвязь между фильтрами, то есть если я "принесу" один фильтр на машину, какова вероятность что для работы он потребует другой. И будут ли они вообще работать если перенести COM объект фильтра на машину без DirectX/DirectShow (перенести = "перенести dll и зарегистрировать ее в реестре")?
В общем, интересны Ваши мнения, советы. К сожалению времени мало, задача не типовая для меня. Шуршу интернет, но думаю Ваши советы как опытных программистов могут значительно помочь. Советы "иди ты на... принимаются с благодарностью
Sergey84 :
а. поздние версии Windows, где, как мне известно (не из очень достоверных источников), нет DirectX (и DirectShow в частности)
А источник хотелось бы узнать. Хотя сразу скажу, что это чушь. Достаточно пройтись по сайтам фирм-изготовителей ТВ-тюнеров - везде уже есть софт для Висты. Да и мои скромные поделки работают на висте без проблем.
Sergey84 :b. на серверных станциях (Windows Server 2003, 2007), где установить DirectX просто не дадут.
DirectX в каком-то виде есть на любом компе, даже на сервере. Иначе даже звуки играться не будут.
По секрету скажу, что пока я экспериментировал с подключениями к графам в "чужих" программах, заметил, что приложения МС Офис зачем-то строят граф, в котором рендерится какой-то файл на Null Renderer.
Sergey84 :как можно иначе использовать кодеки? Вариант: открывать их как ком-объекты, и использовать не встраивая в граф
Можно, но по сути это будет создание своей инкарнации графменеджера.
Sergey84 :какова взаимосвязь между фильтрами, то есть если я "принесу" один фильтр на машину, какова вероятность что для работы он потребует другой
Фильтр - это некая dll, которой для работы, возможно, нужны другие dll. Эти всё и ограничивается.
Короче, напишите простейшее приложение, которое строит граф, и проверьте его на целевых системах.
А фильтры запускать без регистрации можно. Могу дать код. Так работают многие плеера, например, KMPlayer.
Ещё можно глянуть исходники VLC, может быть он без графа обходится, т.к. в линуксе нет directshow, а VLC кроссплатформенный.
Еще вопросик с Вашего позволения:
- а есть ли в интернете база бесплатных кодеков (dll). Интересуют базовые кодеки (кодеры и декодеры) для AVI, MPEG, QT, другие.
Интересуют свободные для распространения. Которые можно свободно запихнуть в дистрибутив. Повторюсь, пока требуются только базовые кодеки, с минимальной поддержкой (например, без компрессии). Лишь бы свободные.
Sergey84 :
базовые кодеки, с минимальной поддержкой (например, без компрессии)
Не понял, как это - кодек без компрессии?
Я не знаю, есть ли такая база. Можно опять же смотреть в дистрибутивах бесплатных плееров, в том KMPlayer. Хотя там обычно декодеры, но в некоторых есть и кодировщики.
Будем считать что ничего про кодеки без компрессии я не говорил
Я понимаю что бесплатных кодеков полно, но они бесплатны для использования.
Кодеков с полностью свободной лицензией (Mozilla Lic) для коммерческого распространения пока не нашел.
Дорогие друзья, я в замешательстве.
Напомню, что задача - конвертирование видео без DirectShow, но с фильтрами.
То есть необходимо запустить заранее известный минимальный набор фильтров на машине где DirectShow не стояло и не будет никогда.
Фильтры перенести - не проблема (в общем случае).
Они будут зарегистрированы как в обычной системе.
А вот что сделать с другими компонентами DirectShow, которые используются фильтрами, такими как
IMediaSample, Allocator и т.д. Ведь все они требуются для нормальной работы фильтров.
В принципе написать свои объекты также не проблема, и зарегистрировать их. Но как узнать все что понадобится? Какие там еще компоненты могут потребоваться, фиг знает...
В общем, я в замешательстве. Что можете подсказать.
В ходе проекта я уже несколько раз менял точку зрения с "все хорошо" на "проект провале". И все потому что "брошен" В DirectShow с обрыва, без подготовки. есть ли идеи у Вас?
Заранее благодарен.
Сергей.
Sergey84 :
на машине где DirectShow не стояло и не будет никогда
Я уже говорил, что directshow не может совсем не быть. Вы попробовали запустить на целевой системе хотя бы графэдит и попробовать в нём поработать? Это займёт не боле 5 минут, но зато сразу снимет все вопросы.
Нет, не пробовал. Возможно Вы правы.
Проблема только в том что целевой системы у меня нет.
Речь идет о серверной станции, насколько мне известно MS Windows Server 2007.
Но точно не известно, от постановщика задачи есть только входящие условия.
Попробую развести на информацию
Спасибо.
Такой ОСи я не знаю. Есть MS Windows Server 2008. Если я правильно понимаю, то это "серверная Виста". Если у вас есть дистрибутив, то можно его установить и проверить всё живьём. На обычной висте DS-программы работают, в целом, без проблем.
Если дистра нет, то можно попытаться договориться с заказчиком, чтобы он сделал вам вход на удалённый раб. стол его сервера, вы сможете зайти и посмотреть, работают ли там ds-программы.
добавлено спустя 8 ч. 51 минут
Sergey84,
Поставил Сервер 2008 на виртуальную машину. DirectShow там есть, как и следовало ожидать. Граф строится, по умолчанию там очень мало фильтров, но основные есть. Так что никаких проблем не вижу. Проверка заняла не более получаса.
Кстати, по поводу кодеков, о которых я спрашивал ранее. Если кому пригодится, советую обратить внимание на FFmpeg кодек: открытый код, свободное распространение, и, построенные на их основе FFDShow (вроде так называется). Последний более законченный, также OpenSource и свободный к распространению/модификации.
А вот еще вопросик. есть ли в природе такие фильтры, которые внутри программы можно включить в граф и закачивать туда поток байтов из памяти, а он передаст этот поток далее по графу. Ну и соответственно, хотелосьбы надеятся что есть еще и обратный фильтр, вынимающий поток из графа. То есть программа имеет Х килобайт входных данных и хочет получить Y килобайт выходных, прошедших через заранее построенный фильтр. Пока поиски ни к чему не привели.
Ну, и если нет, следующий вопрос. Трудно ли написать фильтр с нуля? Информации кучу начитался, и подумал что написать такие фильтры с нуля (т.е. без базового класса) реально, но много кто отговаривает. Времени максимум неделя Очень надеюсь что указанные фильтры все-таки есть.
Sergey84,
Это называется "мост". Вроде бы есть такие фильтры, даже в исходниках. Но я не искал, я написал свой фильтр, который получает данные и выдаёт их в граф. Обратного не писал.
Но писать "с нуля" никто не заставляет. Есть базовые классы в ds sdk, в данном случае, фильтр должен быть основан на классе CBaseFilter.
К сожалению, вынужден вновь Вас побеспокоить.
Толи я "туплю", толи задача оказалась сложнее чем я думал.
Мосты готовы и работают. Все отлично.
Но вот вопрос с фильтрами остается открытым...
Разрекламированный мною FFDShow незаметно для меня перестал работать... В чем дело не пойму. Многократно переустанавливал из разных источников.
А вопрос мой вот в чем: скажем надо сконвертировать поток в MPEG. При этом исходный формат не так важен, так как декодеров на машине куча. Вопрос в том какой MPEG энкодер использовать. Требования к нему следующие:
1. фильтр бесплатный. Ранее я выдвигал требование о свободном распространении. Отменяем. Считаем что фильтр скачивается конечным пользователем для личного пользования.
2. фильтр поддерживает некоторый интерфейс для минимальных настроек качества/степени сжатия.
Интересно то, что в Висте такие фильтры как я понимаю стоят по умолчанию, там много энкодеров. А вот в XP/2000 их нет - только декодеры (оно в принципе и понятно, для обычной жизни энкодеры не нужны).
Буду благодарен любой информации, в т.ч. и как использовать FFDSHow.
Ну не работает он у меня хоть убейся.
Делаю так:
1. Добавляю Async Source Filter
2. Добавляю ffdshow video encoder
3. Делаю intellegent connect этих двух - удачно срабатывает, делает связку
4. делаю рендер выходного пина энкодера на Dump (по-всякому пробовал, и через Mux и напрямую) - ничего. Энкодер не сосет данные, т.е. файл нулевой. Пробовал кучу настроек - не помогло. Иногда (при определенных настройках) в файл что-то и закачивается, но непонятно что и явно меньше чем надо.
Все вышесказанное делал в GraphEdit на стандартных Source и Dump - мои ошибки исключены.
Sergey84 :
Вопрос в том какой MPEG энкодер использовать. Требования к нему следующие:
1. фильтр бесплатный.
Из бесплатных mpeg2 энкодеров я знаю только Intervideo. Но он "игрушечный" по сути, т.к. не поддерживает интерлейс.
Вообще странно, если в висте по умолчанию есть какие-то бесплатные энкодеры кроме MS MJPEG. По идее они должны быть платными.
С FFDSHow я не работал. Из ваших слов не понятно, что такое ffdshow video encoder. Это именно mpeg2 энкодер? Или не пойми какой? Как он настраивается?
Да, спасибо, InterVideo посмотрел - в принципе для первой версии продукта достаточно. Одно смущает - на тестовых файлах он выдает смещение и искажение - то есть размер не соответствует первоначальному, центр смещен из=за чего часто картинки пропадает.
Про FFDSHow (основан на ffmpeg - тоже открытая библиотека, очень известная, использовалась во многих платных и бесплатных проектах) - это opensource кодек. Для кодирования используется ffdshow video encoder. Настраивается через GUI, но переделать на программный интерфейс не проблема.
Внутри содержит тучу настроек кодирования mpeg2, mpeg4, WMV и т.д. + много настроек качества, эффектов. Но вот беда - в ряде случаев просто не работает.
Про FFDShow - примеры конечно есть, тем более проект opensource - можно было бы протрассировать все это дело. Но времени очень мало, жесткие временные рамки. Требуют наискорейшего результата, пусть и менее функционального.
Про InterVideo: настройки глюк не исправляют, но и проявляется он не всегда. Надеюсь для пилотной версии хватит. Кстати, пока не нашел описания программной настройки InterVideo (правда пока искал мало, не было интернета). Если у Вас что-то есть на эту тему, буду очень благодарен. Интересует задание параметров из программы, есть ли интерфейс?
В любом случае Спасибо Вам, Вы мне очень помогли по этому проекту.
продолжая тему
столкнулся с проблемой в седьмой винде
все хорошо все компилится, только вот немогу отлаживать сво ифильтры - студитя пишет что для графедита нема символов для отладки.
уже и пересобрал поэкт с последним либами - ниче не помогает
на тазике стоит
студия 2008 СП1
виндавс 7 сдк
дебаг симбалз