Работа С Видео В Delphi

Тема в разделе "Delphi - Multimedia, Графика, Игры", создана пользователем Anjuta, 2 июн 2012.

  1. Anjuta

    Anjuta New Member

    Регистрация:
    2 июн 2012
    Сообщения:
    1
    Симпатии:
    0
    Подскажите пожалуйста, как привязать видео к отдельной записи в DBGrid, чтобы по двойному нажатию на названия мульта к примеру появлялось видео этого мульта.
    Заранее спасибо=)
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Не вижу проблем. Событие OnDblClick

    Код (Delphi):
    procedure TForm1.DBGrid1DblClick(Sender: TObject);
    var
    AviFileName: string;
    begin
    MediaPlayer1.Close;

    AviFileName := AviFileDir + DBGrid1.SelectedField.AsString;

    if FileExists(AviFileName) then
    begin
    MediaPlayer1.FileName := AviFileName;
    MediaPlayer1.Open;
    MediaPlayer1.Play;
    end;
    end;
     
  3. badboy

    badboy Member

    Регистрация:
    18 сен 2013
    Сообщения:
    5
    Симпатии:
    0
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, OleCtrls, WMPLib_TLB, ExtCtrls;

    type
    TForm1 = class(TForm)
    WindowsMediaPlayer1: TWindowsMediaPlayer;
    Button1: TButton;
    Button2: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);


    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    WindowsMediaPlayer1.Controls.currentPosition:=0;
    WindowsMediaPlayer1.Controls.play;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    WindowsMediaPlayer1.Controls.currentPosition:=11;
    WindowsMediaPlayer1.Controls.play
    end;
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    If WindowsMediaPlayer1.Controls.currentPosition := 7
    Then WindowsMediaPlayer1.Controls.currentPosition := 0; <---
    If WindowsMediaPlayer1.Controls.currentPosition := 20
    Then WindowsMediaPlayer1.Controls.currentPosition := 10; <---
    end;
    end.
    Постоянно выходит сообщение "type of expression must be boolean"! понимаю что условие требует смены типа данных, пытался отождествить currentPosition с переменной, но не получается. currentPosition не распознает, хотя вместе с Controls все нормально! помогите написать код. как написать правильно условие?
     
  4. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Вы видимо просто переутомились слегка... :)
    Код (Delphi):
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    if (WindowsMediaPlayer1.Controls.currentPosition = 7) then
    WindowsMediaPlayer1.Controls.currentPosition := 0;

    if (WindowsMediaPlayer1.Controls.currentPosition = 20) then
    WindowsMediaPlayer1.Controls.currentPosition := 10;
    end;
    Кстати, я думаю что даже в исправленном виде Ваш код не будет работать так как Вы того ожидаете.
    Не следует надеяться что Ваш таймер будет "тикать" на каждой новой позиции плеера.
    Если Вы сделаете таймер с оочень коротким временем срабатывания, все равно есть большая вероятность, что пока вы осуществляете проверку currentPosition на равенство с 7,
    фактическая позиция рлеера уже может оказаться больше 20. Это потому что плеер и таймер работают в разных потоках... :)

    Если Вы хотите отслеживать изменение позиции плеера, следует обработать событие OnPositionChange:
    Код (Delphi):
    procedure TForm1.WindowsMediaPlayer1PositionChange(ASender: TObject;
    oldPosition, newPosition: Double);
    begin
    if (newPosition = 7) then
    WindowsMediaPlayer1.controls.currentPosition := 0
    else if (newPosition = 20) then
    WindowsMediaPlayer1.controls.currentPosition := 10;
    end;
    вот. гдето так :)
     
  5. badboy

    badboy Member

    Регистрация:
    18 сен 2013
    Сообщения:
    5
    Симпатии:
    0
    СПАСИБО огромное!!! Но у меня теперь не получается сделать повтор видео! То есть видео должно воспроизводится циклически:
    if (newPosition = 7) then
    WindowsMediaPlayer1.controls.currentPosition := 0 - после этих строк видео опять должно непрерывно вопроизводить ДО 7 секунды к примеру, а на деле он проигрывает дальше ДО КОНЦА!

    2)
    else if (newPosition = 20) then
    WindowsMediaPlayer1.controls.currentPosition := 10; - здесь он останавливается после того как доходит 20 секунды, а должен начать СНОВА!
     
  6. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Да блин... А ведь я Вас оказывается обманул...
    Заглянул в MSDN, там написано что событие OnPositionChange наступает только если пользователь сам (кликом по контролам управления) меняет позицию, либо в коде устанавливается новый currentPosition...
    Так что извиняйте, я не нарочно... :)
    Даже не знаю что теперь посоветовать... Можете попробовать конечно по таймеру ловить, но боюсь будете "промахиваться" часто, особенно если систему нагрузить...
    Боюсь Вам нужно через DirectX учиться авишкой управлять... :(
    Попробуйте почитать вот про эту библиотеку http://code.google.com/p/dspack/
     
  7. badboy

    badboy Member

    Регистрация:
    18 сен 2013
    Сообщения:
    5
    Симпатии:
    0
    Словить по таймеру не проблема. Главная загвоздка в том, что он вообще не видит условие по которому нужно менять текущую позицию - дальше идет после 7 секунды. А я хотел бы чтобы он обратно скинул на начало. Пробовал разные коды, но все без толку. Как цикл для видео ставиться в WindowsMadiaPlayer? может я что-то не так делаю? С repeat не сталкивался:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    WindowsMediaPlayer1.Controls.play;
    WindowsMediaPlayer1.Controls.currentPosition:=0;
    repeat
    WindowsMediaPlayer1.Controls.currentPosition:=0 ;
    until
    WindowsMediaPlayer1.Controls.currentPosition=7 ;
    end;
    Не выходит!
     
  8. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Какое условие и в каком месте Вы используете? Код покажите.
    Код
    Код (Delphi):
    WindowsMediaPlayer1.Controls.currentPosition :=0;
    скидывает вначало (как Вы говорите) :)
    Другое дело что выполнение этого кода может занять некоторое время. Я уже Вам пытался объяснить WindowsMediaPlayer1 это Activex control и работает в другом процессе.
    Какие коды? Вы же сказали что по таймеру "без проблем" ловbте? :)
    А что (по Вашему разумению) должен сделать данный код? :)
    Я вижу это так:
    1. Запустить воспроизведение с текущей позиции.
    2. Запустить воспроизведение с 0-й позиции.
    3. Цикл:
    3.1. Запустить воспроизведение с 0-й позиции.
    3.2. Вывалиться из цикла если currentPosition=7, иначе Запустить воспроизведение с 0-й позиции (3.1.)

    Повторяю: Activex control - это чужой процесс. То что окошко у Вас на форме еще ни о чем не говорит.
    Это значит, если плеер воспроизводит/рисует блоками (например) по 25 кадров (в зависимости от частоты и битрейта ролика), то получив ваш вопрос "А какая сейчас позиция?", он сначала "дорисует" блок и только потом ответит. И не факт что в этом случае значение позиции "7" вообще реально получить, а например только 6 и 8. Или вообще "7.2" поскольку позиция у WindowsMadiaPlayer это вешественное число. :)
    Даже если Вам повезло и Вы "поймали" позицию "7", это не означает что плеер остановился и ждет что Вы ему дальше там скажете делать. Он ответил и воспроизводит себе дальше. Т.е. в момент когда вы обрабатываете условие, реальная позиция уже явно больше чем "7", тем более что Вы даже на паузу его не ставите.

    Короче. Я не знаю какова "главная идея" приложения которое Вы пишете, но исходя из имеющейся информации я вижу две возможности:
    1. В самой авишке, в нужных позициях, расставить маркеры и отлавливать их через событите OnMarkerHit.
    2. Отказаться от TWindowsMadiaPlayer и воспроизводить ролик "самостоятельно".
    В обоих случаях это делается с помощью DirectMedia SDK.
     
  9. badboy

    badboy Member

    Регистрация:
    18 сен 2013
    Сообщения:
    5
    Симпатии:
    0
    Извините что я так глупо начал не объяснив суть проекта! Это программка по моему виденью должна будет на клики одних кнопок вопроизводить один промежуток, на других - другой! Мне приходила мысль разбить клип на 2 видео, но я побоялся что переход будет заметным: пользователь должен думать что видео реагирует и преобразовывается его кликом! Простите еще раз за непозволительную глупость с моей стороны! НО Как можно прописать код так чтобы:
    1) он быстро находил файл из компьютера и использовал?
    2) при заканчивании вопроизведения он начинал сначала чтобы не выдать отрезок, а создать иллюзию бесконечности видео!
     
  10. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    То есть (я так понимаю) Вы не желаете потратить немного саоего времени, чтобы ознакомиться с возможностями DirectMedia и воспроизвести видео собственным кодом, так как вам надо.
    Вместо этого, Вы продолжаете упорстовать "в своей ереси" и продолжаете настаивать на том что обязательно необходимо заставить программый продукт компании Microsoft (компонент WindowsMediaPlayer это на самом деле просто интерфейс реализующий "пульт управления" программой Windows Media Player) работать не так как придумали создатели, а так как хочется Вам...
    Правильно я Вас понял? B)

    1. WindowsMediaPlayer не будет за Вас ничего находить. Он может начать воспроизведение если Вы будете подавать ему файлы сами:
    WindowsMediaPlayer1.media := 'c:\avi1.avi';
    WindowsMediaPlayer1.media := 'c:\avi2.avi';
    и т.д.

    2) Для того чтобы он крутил одну и туже авишку "по кругу", выставьте соответствующе свойство контрола (по моему loop называется или как то наподобие).
    При смене же проигрывания одного ави файла на другой, быстрой (незаметной для пользователя) смены картинки ожидать не приходится.
    Потому как прежде чем начать воспроизведение Windows Media Player должен определить формат файла, подобрать подходящий для воспроизведения кодек и выставить внутренние настройки необходимые для воспроизведения.
    А еще, кстати, он может попытаться слазить в интернет чтобы проверить нету ли обновленных кодеков для данного формата видео... :)

    Вот както так дела обстоят...
    Вы кстати так и не признались что "изобретаете"...
    На самом ли деле Вам нужно воспроизводить видеофайлы?
    Может вам достаточно завести массив битмапов, загрузить в него картинки и выводить в необходимом порядке и нужной скоростью в окошке формы?
    Чем не авишка? :)
     
  11. badboy

    badboy Member

    Регистрация:
    18 сен 2013
    Сообщения:
    5
    Симпатии:
    0
    может direct show? Я бы с радостью перешел на него если бы знал хоть немного о нем! Я тут не могу нормально код написать, а там для меня вообще темный лес!
    Я ввел WindowsMediaPlayer1.newMedia := 'c:\avi1.avi'; он мне выдал ошибку.
    и loop в свойствах не нашел(((((( кто-то предлагает WindowsMediaPlayer1.settings.setMode
    быть может в direct show легче?)
     
Загрузка...

Поделиться этой страницей