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

  • Автор темы Anjuta
  • Дата начала
A

Anjuta

Подскажите пожалуйста, как привязать видео к отдельной записи в DBGrid, чтобы по двойному нажатию на названия мульта к примеру появлялось видео этого мульта.
Заранее спасибо=)
 
S

sinkopa

Подскажите пожалуйста, как привязать видео к отдельной записи в DBGrid, чтобы по двойному нажатию на названия мульта к примеру появлялось видео этого мульта.
Заранее спасибо=)
Не вижу проблем. Событие OnDblClick

Код:
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;
 
B

badboy

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 все нормально! помогите написать код. как написать правильно условие?
 
S

sinkopa

unit Unit1;
...
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 все нормально! помогите написать код. как написать правильно условие?
Вы видимо просто переутомились слегка... :)
Код:
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:
Код:
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;
вот. гдето так :)
 
B

badboy

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

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

sinkopa

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

2)
else if (newPosition = 20) then
WindowsMediaPlayer1.controls.currentPosition := 10; - здесь он останавливается после того как доходит 20 секунды, а должен начать СНОВА!
Да блин... А ведь я Вас оказывается обманул...
Заглянул в MSDN, там написано что событие OnPositionChange наступает только если пользователь сам (кликом по контролам управления) меняет позицию, либо в коде устанавливается новый currentPosition...
Так что извиняйте, я не нарочно... :)
Даже не знаю что теперь посоветовать... Можете попробовать конечно по таймеру ловить, но боюсь будете "промахиваться" часто, особенно если систему нагрузить...
Боюсь Вам нужно через DirectX учиться авишкой управлять... :(
Попробуйте почитать вот про эту библиотеку
 
B

badboy

Словить по таймеру не проблема. Главная загвоздка в том, что он вообще не видит условие по которому нужно менять текущую позицию - дальше идет после 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;
Не выходит!
 
S

sinkopa

Словить по таймеру не проблема. Главная загвоздка в том, что он вообще не видит условие по которому нужно менять текущую позицию - дальше идет после 7 секунды.
Какое условие и в каком месте Вы используете? Код покажите.
А я хотел бы чтобы он обратно скинул на начало.
Код
Код:
WindowsMediaPlayer1.Controls.currentPosition :=0;
скидывает вначало (как Вы говорите) :)
Другое дело что выполнение этого кода может занять некоторое время. Я уже Вам пытался объяснить WindowsMediaPlayer1 это Activex control и работает в другом процессе.
Пробовал разные коды, но все без толку.
Какие коды? Вы же сказали что по таймеру "без проблем" ловbте? :)
Как цикл для видео ставиться в WindowsMadiaPlayer? может я что-то не так делаю?
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
WindowsMediaPlayer1.Controls.play;
WindowsMediaPlayer1.Controls.currentPosition:=0;
repeat
WindowsMediaPlayer1.Controls.currentPosition:=0;
until
WindowsMediaPlayer1.Controls.currentPosition=7;
end;
Не выходит!
А что (по Вашему разумению) должен сделать данный код? :)
Я вижу это так:
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.
 
B

badboy

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

sinkopa

Извините что я так глупо начал не объяснив суть проекта! Это программка по моему виденью должна будет на клики одних кнопок вопроизводить один промежуток, на других - другой! Мне приходила мысль разбить клип на 2 видео, но я побоялся что переход будет заметным: пользователь должен думать что видео реагирует и преобразовывается его кликом!
То есть (я так понимаю) Вы не желаете потратить немного саоего времени, чтобы ознакомиться с возможностями DirectMedia и воспроизвести видео собственным кодом, так как вам надо.
Вместо этого, Вы продолжаете упорстовать "в своей ереси" и продолжаете настаивать на том что обязательно необходимо заставить программый продукт компании Microsoft (компонент WindowsMediaPlayer это на самом деле просто интерфейс реализующий "пульт управления" программой Windows Media Player) работать не так как придумали создатели, а так как хочется Вам...
Правильно я Вас понял? B)

Простите еще раз за непозволительную глупость с моей стороны! НО Как можно прописать код так чтобы:
1) он быстро находил файл из компьютера и использовал?
2) при заканчивании вопроизведения он начинал сначала чтобы не выдать отрезок, а создать иллюзию бесконечности видео!
1. WindowsMediaPlayer не будет за Вас ничего находить. Он может начать воспроизведение если Вы будете подавать ему файлы сами:
WindowsMediaPlayer1.media := 'c:\avi1.avi';
WindowsMediaPlayer1.media := 'c:\avi2.avi';
и т.д.

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

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

badboy

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!