Разбить видео поток на 2 части
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов DirectShow форум -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
Витяня
Новенький


Зарегистрирован: 01.07.2007
Сообщения: 6

СообщениеДобавлено: Вс Июл 01, 2007 10:15 pm    Заголовок сообщения: Разбить видео поток на 2 части Ответить с цитатой

Подскажите, как разрезать видео пополам по вертикали. Конкретно проблема состоит в следующем: есть файлы в формате wmv с расширением 800*1200 или 1024*1536, к компьтеру подключено 2 монитора, в вертикальном расширении рабочего стола, необходимо одну половину файла показывать на одном мониторе, а другую на втором. Программа реализуется в Delphi или Builder6.
Заранее благодарен.

P.S. Возможно кто-то предложит вариант без разбивки видео, тоже будет полезно, лиш бы показывало на обоих мониторах
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
WondeRu
Главвред :)


Зарегистрирован: 30.10.2006
Сообщения: 183
Откуда: Самара

СообщениеДобавлено: Пн Июл 02, 2007 8:14 am    Заголовок сообщения: Re: Разбить видео поток на 2 части Ответить с цитатой

Используй Smart Tee фильтр для разбивки потока, затем выводи на два VMR9 рендерера. В свойствах рендереров указываете положение картинки на экране. Т.е. на первом указываете отображение левой части картинки, на втором - правой.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
WondeRu
Главвред :)


Зарегистрирован: 30.10.2006
Сообщения: 183
Откуда: Самара

СообщениеДобавлено: Пн Июл 02, 2007 8:20 am    Заголовок сообщения: Ответить с цитатой

PS. рендереры помещать на разных формах
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Витяня
Новенький


Зарегистрирован: 01.07.2007
Сообщения: 6

СообщениеДобавлено: Пн Июл 02, 2007 11:20 am    Заголовок сообщения: Ответить с цитатой

Спасибо огромное, разбивка получилась, как бы мне теперь выделить определённую область из каждого потока, или это просто реализовать скажем вот так:
Код:

pVideoWindow1.put_Owner(Form1.Handle);
pVideoWindow2.put_Owner(Form2.Handle);

....

pVideoWindow1.put_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS);
pVideoWindow1.SetWindowPosition(0,0,Form1.Width,Form1.Height*2); pVideoWindow2.put_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS);
pVideoWindow2.SetWindowPosition(0,0-Form1.Height,Form1.Width,Form1.Height*2);
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
WondeRu
Главвред :)


Зарегистрирован: 30.10.2006
Сообщения: 183
Откуда: Самара

СообщениеДобавлено: Вт Июл 03, 2007 9:40 am    Заголовок сообщения: Ответить с цитатой

Не стоит велосипед изобретать. Smile Есть интерфейс IVMRMixerControl9 у VMR9, он управляет положением видео в окне (метод IVMRMixerControl9::SetOutputRect).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Витяня
Новенький


Зарегистрирован: 01.07.2007
Сообщения: 6

СообщениеДобавлено: Ср Июл 04, 2007 6:39 pm    Заголовок сообщения: Ответить с цитатой

Что-то в GraphEdit всё так нормально выглядело, а как сам пытаюсь построить, так что-то ничего не получается(((
WMV формат не использует фильтр SourceFile, он сразу начинает с построения Splitter фильтра, притом неизвестно какого, перепробовал всё, что было - не работает, сам построить немогу, поэтому делаю по тупому:
Код:

pFilter: IBaseFilter
...........
...........
pGraphBuilder.RenderFile(StringToOleStr(OpenDialog1.FileName), '');
pGraphBuilder.FindFilterByName('Video render',pFilter);
pGraphBuilder.RemoveFilter(pFilter);


далее вставляю Smart Tee и 2 VMR9 фильтра, но это же нифига не правильно, как сделать это корректно?


Последний раз редактировалось: Витяня (Ср Июл 04, 2007 7:06 pm), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Витяня
Новенький


Зарегистрирован: 01.07.2007
Сообщения: 6

СообщениеДобавлено: Ср Июл 04, 2007 6:43 pm    Заголовок сообщения: Re: Разбить видео поток на 2 части Ответить с цитатой

WondeRu писал(а):
Используй Smart Tee фильтр для разбивки потока, затем выводи на два VMR9 рендерера. В свойствах рендереров указываете положение картинки на экране. Т.е. на первом указываете отображение левой части картинки, на втором - правой.


Да и я что-то не нашёл как назначить экраны для обоих VMR фильтров, я поискал на msdn2.microsoft.com, но с английским вообще ни как не дружу Sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
WondeRu
Главвред :)


Зарегистрирован: 30.10.2006
Сообщения: 183
Откуда: Самара

СообщениеДобавлено: Ср Июл 04, 2007 7:21 pm    Заголовок сообщения: Re: Разбить видео поток на 2 части Ответить с цитатой

Витяня писал(а):

Да и я что-то не нашёл как назначить экраны для обоих VMR фильтров, я поискал на msdn2.microsoft.com, но с английским вообще ни как не дружу Sad


Если будет время, то через день-три выложу код
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Витяня
Новенький


Зарегистрирован: 01.07.2007
Сообщения: 6

СообщениеДобавлено: Ср Июл 04, 2007 7:53 pm    Заголовок сообщения: Ответить с цитатой

Буду очень признателенSmile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
WondeRu
Главвред :)


Зарегистрирован: 30.10.2006
Сообщения: 183
Откуда: Самара

СообщениеДобавлено: Чт Июл 05, 2007 8:31 am    Заголовок сообщения: Ответить с цитатой

http://directshow.wonderu.com/samples - 4-й исходник. Вместо Smart Tee использовал Infinite Tee
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Витяня
Новенький


Зарегистрирован: 01.07.2007
Сообщения: 6

СообщениеДобавлено: Чт Июл 05, 2007 10:58 pm    Заголовок сообщения: Ответить с цитатой

Огромнейшее спасибо!!!! Тут кстати онаружился один интересный факт, который я не догадался проверить с смаого начала Embarassed , а именно, когда я рендерю файл таким образом pGraphBuilder.RenderFile и вместо стандартного рендера поставляю VMR9, то изображение в полноэкранном режиме преспокойненько отображается на обоих мониторах в вертикальном расширении рабочего стола, т.е. мы по сути и получаем одну половину фильма в одном мониторе, а другую во-втором Very Happy
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
WondeRu
Главвред :)


Зарегистрирован: 30.10.2006
Сообщения: 183
Откуда: Самара

СообщениеДобавлено: Пт Июл 06, 2007 8:25 am    Заголовок сообщения: Ответить с цитатой

Витяня писал(а):
Тут кстати онаружился один интересный факт, который я не догадался проверить с смаого начала Embarassed , а именно, когда я рендерю файл таким образом pGraphBuilder.RenderFile и вместо стандартного рендера поставляю VMR9, то изображение в полноэкранном режиме преспокойненько отображается на обоих мониторах в вертикальном расширении рабочего стола, т.е. мы по сути и получаем одну половину фильма в одном мониторе, а другую во-втором Very Happy

Насколько я помню, у меня с этим были проблемы (возможно не все видеокарты это поддерживают): когда окно на два экрана, то на одном картинка отображается, на втором окно вывода черное. Если не ошибаюсь такое происходит с DVD. Попробуй запустить .vob файл с моим примером и твоим. если заработает, то дело в видеокарточке.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
DeathBaba
Новенький


Зарегистрирован: 03.08.2007
Сообщения: 1

СообщениеДобавлено: Пт Авг 03, 2007 3:53 pm    Заголовок сообщения: Проблемы с DVD Ответить с цитатой

Господа, а как правильно использовать Inf Tee фильтр при воспроизведении DVD? Задача - воспроизвести DVD в двух окнах. Проблема - в двух окнах воспроизводятся только DVD без защиты (не лицензионные диски). На лицензионных при попытке воспроизведения приходит событие EC_DVD_ERROR с ошибкой DVD_ERROR_CopyProtectFail.

Последовательность действий следующая: Использую IDVDGraphBuilder::RenderDvdVideoVolume для создания графа, затем disconnect Video Output pin DVD Navigator'а от декодера, добавляю в граф Infinite Tee фильтр, и переподключаю его входы c DVD Navigator а выходы с декодером.

Замечено, что:
1) Смена декодера не помогает
2) Если добавить в граф Inf Tee до вызова IDVDGraphBuilder::RenderDvdVideoVolume, Inf Tee после вызова этого метода из графа удаляется
3) Если вручную билдить граф без IDVDGraphBuilder, для лицензионных дисков приходит та же ошибка.

Используемый код можно увидеть здесь: http://forums.microsoft.com/MSDN/showpost.aspx?postid=1957338&siteid=1
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
kostasoft
Активный


Зарегистрирован: 28.07.2007
Сообщения: 35

СообщениеДобавлено: Сб Авг 18, 2007 7:55 pm    Заголовок сообщения: Ответить с цитатой

Ну что ж, сделал разделение и вывод кадров в разные видеорендеры
Код:
procedure TfmMain.bOpenClick(Sender: TObject);
var
  hr: HRESULT;
  ARect1,ARect2: TVMR9NORMALIZEDRECT;
begin
  if OpenDialog.Execute then
    begin
      if True then  //вертикальная стереопара
         begin
        ARect1.top    := 0;
        ARect1.bottom := 2;
        ARect1.left   := 0;
        ARect1.right  := 1;
        ARect2.top    := -1;
        ARect2.bottom := 1;
        ARect2.left   := 0;
        ARect2.right  := 1;
         end
      else         //горизонтальная стереопара
        begin
        ARect1.top    := 0;
        ARect1.bottom := 1;
        ARect1.left   := 0;
        ARect1.right  := 2;
        ARect2.top    := 0;
        ARect2.bottom := 1;
        ARect2.left   := -1;
        ARect2.right  := 1;
        end;
      (VideoWindow1 as IVMRMixerControl9).SetOutputRect(0,@ARect1);
      (VideoWindow2 as IVMRMixerControl9).SetOutputRect(0,@ARect2);
      pGraphBuilder := (FilterGraph1 as IGraphBuilder);
      hr := pGraphBuilder.AddSourceFilter(StringToOleStr(OpenDialog.FileName), '', pSourceFile);
      if FAILED(hr) then begin
        ShowMessage('Не удается добавить к графу фильт источника');
        exit;
      end;
      hr := CoCreateInstance(CLSID_InfTee, nil, CLSCTX_INPROC, IID_IBaseFilter, pInfTee);
      if FAILED(hr) then begin
        ShowMessage('Не удается создать IInfTee');
        exit;
      end;
      hr := CoCreateInstance(CLSID_AudioRender, nil, CLSCTX_INPROC, IID_IBaseFilter, pAudioRender);
      if FAILED(hr) then begin
        ShowMessage('Не удается создать AudioRender');
        exit;
      end;
      pGraphBuilder.AddFilter(pInfTee, 'Inf Tee');
      pGraphBuilder.AddFilter(pAudioRender, 'Audio');
      FilterGraph1.QueryInterface(IID_ICaptureGraphBuilder2, pCaptureGraphBuilder2);
      pCaptureGraphBuilder2.RenderStream(nil, nil, pSourceFile as IBaseFilter, nil, pInfTee as IBaseFilter);
      pCaptureGraphBuilder2.RenderStream(nil, nil, pSourceFile as IBaseFilter, nil, pAudioRender as IBaseFilter);
      pCaptureGraphBuilder2.RenderStream(nil, nil, pInfTee as IBaseFilter, nil, VideoWindow1 as IBaseFilter);
      pCaptureGraphBuilder2.RenderStream(nil, nil, pInfTee as IBaseFilter, nil, VideoWindow2 as IBaseFilter);

      FilterGraph1.Play;
   end;
end;

1. Не могу вывести в DSVideoWindowEx2. А он был бы предпочтительней (вывод в полноэкранном режиме на разные мониторы, вывод на рабочий стол в качестве обоев и т.д.)
2. Изображене в видеорендере получается вытянутым. Как его растянуть на весь экран.
_________________
http://kostasoft.com - Наш софт!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение AIM Address
WondeRu
Главвред :)


Зарегистрирован: 30.10.2006
Сообщения: 183
Откуда: Самара

СообщениеДобавлено: Пн Авг 20, 2007 8:11 am    Заголовок сообщения: Ответить с цитатой

kostasoft писал(а):
1. Не могу вывести в DSVideoWindowEx2. А он был бы предпочтительней (вывод в полноэкранном режиме на разные мониторы, вывод на рабочий стол в качестве обоев и т.д.)
2. Изображене в видеорендере получается вытянутым. Как его растянуть на весь экран.


1. Что значит "не могу"?
2. Вытянутость и т.п. регулируется через (VideoWindow1 as IVMRMixerControl9).SetOutputRect(0,@ARect1); Выставляешь разные параметры ARect1, таким образом регулируешь пропорции
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов DirectShow форум -> Общий Часовой пояс: GMT + 4
На страницу 1, 2  След.
Страница 1 из 2
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB


Рейтинг@Mail.ru