На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> (Видео+Bitmap)*realtime=?
    Всем привет!
    Есть надобность проигрывать любой видеофайл установленым в системе видеокодеком, с наложением картинки (TBitmap) по определённой маске или по исключению цвета.
    Пробвал компонент DSPACK, НО минус в том что при сварачивании или закрыванием ОКНА С ВИДЕО другим окном - прекращается наложение картинки и текста на полноэкранное устройство, хотя видео выводится.
    И отсуцтвует очень важная и нужная вещь: ресайз (Resize) играющего видео. Оно нужно для того, чтоб проигрывать клип любого размера в размере к примеру 720х576 без потери пропорций, ибо видео может быть и большего и меньшего размера и при наложении на него картинки будет разное качество или размер. Компонент TVideoGrabber не подходит по той-же причине, отсуцтвие проигрывания видео в заданом размере (Resize).

    В связи с этим ищется компонент который мог бы это организовать. Посоветуйте плиз.
    Сообщение отредактировано: Smike -
      Scally
      Да все там есть. Только готовить надо уметь.

      Цитата Scally @
      И отсуцтвует очень важная и нужная вещь: ресайз (Resize) играющего видео. Оно нужно для того, чтоб проигрывать клип любого размера в размере к примеру 720х576 без потери пропорций, ибо видео может быть и большего и меньшего размера и при наложении на него картинки будет разное качество или размер.

      VideoWindow.VMROptions.KeepAspectRatio:=true;
      смотри пример
      Demos\D6-D7\VMR\VMRPlayWin

      Цитата Scally @
      , НО минус в том что при сварачивании или закрыванием ОКНА С ВИДЕО другим окном - прекращается наложение картинки и текста на полноэкранное устройство, хотя видео выводится.

      Не понял о чем это ты. Ну останови вывод. Или в OnPaint обробатывай.
      попробуй поставить VideoWindow.VMROptions.Preferences+{или -}[vpPreferAGPMemWhenMixing]

      А вобще мне больше нравится VFW (Video For Windows).
        Цитата Pavia @
        Scally
        Да все там есть. Только готовить надо уметь.
        Покрайней мере при рисовании на видео окне прямо в примере видео начинает мерцать Это говорит о уже не пригодности компонента.

        Цитата Scally @
        И отсуцтвует очень важная и нужная вещь: ресайз (Resize) играющего видео. Оно нужно для того, чтоб проигрывать клип любого размера в размере к примеру 720х576 без потери пропорций, ибо видео может быть и большего и меньшего размера и при наложении на него картинки будет разное качество или размер.

        VideoWindow.VMROptions.KeepAspectRatio:=true;
        смотри пример
        Demos\D6-D7\VMR\VMRPlayWin
        кго и смотрел! А толку? Там такого нет.

        Цитата Scally @
        , НО минус в том что при сварачивании или закрыванием ОКНА С ВИДЕО другим окном - прекращается наложение картинки и текста на полноэкранное устройство, хотя видео выводится.

        Не понял о чем это ты. Ну останови вывод. Или в OnPaint обробатывай.
        попробуй поставить VideoWindow.VMROptions.Preferences+{или -}[vpPreferAGPMemWhenMixing]
        Ничего из этого непомогает! При сварачивании видео окна или закрыванием его другим окном полностью - прекращается наложение хоть картинки, хоть текста.

        А вобще мне больше нравится VFW (Video For Windows).
        Мне-бы тоже понравилось если были примеры.
        кинь если есть плиз.
        я недумаю что моя задача очень сложна!

        Но кроме как ответов: - "Копай там-то - там-то"
        никто ничё неможет. Я уже весь в земле :)! Нашел много другого кроме этого, а если и находил похожее, то оно по каким-то мелочным причинам неподходит.

        Такое ощущение что никто незнает как это сделать.

        Если несложно закинь примеров поболее для VWF.

        Может у тебя аська есть? Так было-б быстрее.

        Буду рад РАБОЧИМ примерам. Те что в комплекте - не работают толком!
          Вот наложение.
          ExpandedWrap disabled
               VMRBitmap:= TVMRBitmap.Create(VideoWindow);
               Bitmap:=TBitmap.Create;
               with VMRBitmap, Canvas do
               try
                  Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName) + '\penguin.bmp');
                  LoadBitmap(Bitmap);
                  ColorKey:=clFuchsia;
                  Options := VMRBitmap.Options + [vmrbSrcColorKey];
                  Source := VMRBitmap.Canvas.ClipRect;
                  DrawTo(0,0,1,1, 1);
                finally
                  Bitmap.Free;
                end;


          А ты делал через canvas. В этом случае ты должен перерисовывать каждый раз когда сробатывает событие onPaint.
            Цитата Pavia @
            Вот наложение.
            ExpandedWrap disabled
                 VMRBitmap:= TVMRBitmap.Create(VideoWindow);
                 Bitmap:=TBitmap.Create;
                 with VMRBitmap, Canvas do
                 try
                    Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName) + '\penguin.bmp');
                    LoadBitmap(Bitmap);
                    ColorKey:=clFuchsia;
                    Options := VMRBitmap.Options + [vmrbSrcColorKey];
                    Source := VMRBitmap.Canvas.ClipRect;
                    DrawTo(0,0,1,1, 1);
                  finally
                    Bitmap.Free;
                  end;


            А ты делал через canvas. В этом случае ты должен перерисовывать каждый раз когда сробатывает событие onPaint.

            А ты сам-то пробвал запускать это???
            Одно из главных недочётов что я тебе писал! ОБЯЗАТЕЛЬНО НАДО ДЕЛАТЬ РЕСАЙЗ!!!!
            Клипы имеют разный размер по X и Y.
            И при наложении текста, или картинки всё это получается разного качества.
            Если клип 720х576 то текст читаемый! А если 360x288 то уже не читабельный, всё кубами!

            Поэтому надо ОБЯЗОН ресайзить видео до к примеру 720х576 а уже потом рисовать на нём текст или картинку!
            Как это сделать???

            И ещё одна проблема! X и Y у DRAWTO вводятся в процентах а не в пикселях! Это очень плохо.


            Кинь пожалуйста примеров для VFW вместе с самим VFW.pas а то мой видать с ошибкой и не компилится! Можно на мыло.
              Для ресайза картинки есть
              with VMRBitmap do
              begin
              DestLeft
              DestTop
              DestRight
              DestBottom
              Dest
              end;
              Опять таки DrawTo(0,0,1,1, 1);

              Для ресайза видео файла есть.
              with (VideoWindow as IVMRMixerControl9) do
              SetOutputRect(0, @NormalizedRect);

              VideoWindow.VMROptions.KeepAspectRatio:=True; - сохронять пропорции

              Для получения размеров.
              VideoWindow.VMROptions.Mode:=vmrWindowless;
              (VideoWindow as IVMRWindowlessControl9).GetNativeVideoSize(W,H,AW,AH);

              VideoWindow.Width
              VideoWindow.Height

              Bitmap.Width
              Bitmap.Height
                а как насчёт того когда видеоокно перекрывается или сварачивается - ВСЕ это дело с наложением прекращается?
                Никакие ONPaint тут не помогают ибо оно как-то системно? когда окно прячется его прорисовка ВАЩЕ прекращается пока оно опять хоть кусочек не будет виден на экране! Попробуй сам свернуть, или перекрой другим окном окно с видео при наложении на него.
                  Scally
                  Пробовал все нормально. Что там у тебя не так? После разворачивания все появляется вновь.
                    Цитата Pavia @
                    Scally
                    Пробовал все нормально. Что там у тебя не так? После разворачивания все появляется вновь.

                    Дык а я очём???
                    Чё толку что он при разварачивании всё появляется вновь! ОН ВАЩЕ НЕ ДОЛЖЕН ИСЧЕЗАТЬ НИКОГДА.
                    Если ты не понял я говорю про отрисовку на полноэкранном устройстве, когда сварачиваешь!!!
                    Оно и делает невозможным использование этого компонента! Оно должо ВСЕГДА быть! И в срёрнутом и в развёрнутом.
                      Scally
                      Так оно все время рисуется. Вот пример снимаем изоброжение свернутого окна.
                      Работает только при
                      // VideoWindow.VMROptions.Mode:=vmrWindowless;
                      ExpandedWrap disabled
                        var
                          Stream: TMemoryStream;
                          bitmap:Tbitmap;
                        begin
                        FormPlayWin.WindowState:=wsMinimized; {сворачиваем}
                         sleep(5000); {пауза}
                          bitmap:=Tbitmap.Create;
                          Stream:= TMemoryStream.Create;
                          try
                            if VideoWindow.VMRGetBitmap(Stream) then
                             begin
                              bitmap.LoadFromStream(Stream);
                              bitmap.SaveToFile(ExtractFilePath(Application.ExeName) + '\pp.bmp');
                             end;
                          finally
                            Stream.Free;
                            bitmap.Free;
                          end;
                        end;
                      Сообщение отредактировано: Pavia -
                        НЕА! Не всё время! Ты посмотри на телик чё идёт?
                        Оно в памяти всегда рисуется, оттуда ты и считываешь, вот и думашь что всегда.
                        А отрисовка на телевизоре (на втором устройстве. НЕ НА МОНИТОРЕ) прекращается когда сварачиваешь окно или закрываешь его другим окном.

                        И твой пример:

                        VMRBitmap:= TVMRBitmap.Create(VideoWindow);
                        Bitmap:=TBitmap.Create;
                        with VMRBitmap, Canvas do
                        try
                        Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName) + '\penguin.bmp');
                        LoadBitmap(Bitmap);
                        ColorKey:=clFuchsia;
                        Options := VMRBitmap.Options + [vmrbSrcColorKey];
                        Source := VMRBitmap.Canvas.ClipRect;
                        DrawTo(0,0,1,1, 1);
                        finally
                        Bitmap.Free;
                        end;

                        вообще не работает пока не начнёшь выводить видео через TFILTER на это окно.
                          Scally
                          У меня телека нет. Но мой совет отключи overlay может поможет.И за одно поставь vmrWindowed.

                          Добавлено
                          Выстави нужны монитор через IVMRMonitorConfig.
                          Сообщение отредактировано: Pavia -
                            Бесполезно! Та-же фигня. А отключение оверлея говорит что вывода на телевизор вообще небудет, что естественно мне НЕНУЖНО.
                            Ты говорил о VFW! Может кинешь мне примеров поболее решение данной задачи.

                            ведь я уверен что для тебя это не сложно

                            1. Открываем на 2-м рабочем столе полноэкранное устройство(Оверлей) размером 720х576
                            2. Играем растягивая клип на весь размер пункта 1
                            3. поверх клипа проэцируем BMPшку

                            ОЧЕНЬ ПРОШУ. Я УЖЕ НЕЗНАЮ К КОМУ ОБРАЩАТЬСЯ.

                            Я уже кучу народу опросил, но все молчат или дают уклончивые ответы типа: капай в инете. Или опять предлагают лажу типа DSPack которая никогда нормально не заработает.
                              Scally
                              Я тут полистал DirectX SDK. Там написанно что надо создовать два устройства для вывода на 2 разных монитора.
                              Так что попробуй через IVMRMonitorConfig установить монитор.

                              Примеров vfw у меня нет. Вернее есть на Си из MSDN.
                                Очень жаль что ещё один человек который незнает как решить мою задачу. неужели я много прошу?
                                  Так ищи DirectShow,
                                  там есть возможность установки изображения под видео, а если не подойдëт такой вариант, то ищи ещё отдельно рисование на экране, то бишь не на форме, или компоненте, а прямо на экране.
                                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0452 ]   [ 15 queries used ]   [ Generated: 7.03.26, 01:47 GMT ]