Вверх ↑
Этот топик читают: Гость
Ответов: 2407
Рейтинг: 691
#91: 2025-05-13 09:39:00 ЛС | профиль | цитата
Aziz, скорее всего что MediaPlayerEx по Handle окна выводит поверх его дочерних элементов (кнопка и картинка) и перекрывает их, что и логично. Не проще ли сделать так:

Add(Label,516766,329,238)
{
Left=70
Top=35
Width=335
Height=225
Align=5
AutoSize=1
Point(Handle)
}
Add(MainForm,13094838,378,294)
{
Width=507
Height=385
Color=-16777203
link(onCreate,1545626:doCreateRect,[])
}
Add(MediaPlayerEx,7794242,329,294)
{
Scale=2
Point(onError)
link(Handle,516766:Handle,[])
}
Add(Image,4167310,476,189)
{
Width=491
Height=346
Align=5
Color=15780518
Point(Handle)
Point(Width)
Point(Height)
}
Add(ODialog,6287391,273,294)
{
Filter="All Unknown Types|*.3gp;*.asf;*.avi;*.divx;*.flv;*.m1v;*.m2v;*.mkv;*.mov;*.mp4;*.mpe;*.mpeg;*.mpg;*.mpv;*.ogm;*.qt;*.ram;*.rm;*.rv;*.swf;*.vob;*.wm;*.wmv;*.aac;*.ac3;*.aif;*.aifc;*.aiff;*.ape;*.au;*.flac;*.it;*.kar;*.lxm;*.m4a;*.mid;*.midi;*.mka;*.mod;*.mp1;*.mp2;*.mp3;*.mpa;*.mpc;*.ogg;*.ra;*.rmi;*.s3m;*.snd;*.stm;*.wav;*.wv;*.wma;*.xm;*.bmp;*.jpeg;*.jpg|All Files|*.*"
Title=""
StartDir=""
FileName=""
link(onExecute,7794242:doOpen,[])
}
Add(Button,5485962,217,294)
{
Left=5
Top=280
Height=45
link(onClick,6287391:doExecute,[])
}
Add(RGN_Rect,1545626,490,308)
{
Point2=100
link(onCreateRect,5949742:doCreateRect,[])
link(Point2,152639:Point,[(503,280)(467,280)(467,387)(426,387)])
}
Add(RGN_Combine,3864493,602,308)
{
Mode=2
link(onCombine,7533673:doSetRegion,[])
link(Region1,1545626:Result,[(608,296)(642,296)(642,351)(496,351)])
}
Add(RGN_Rect,5949742,546,308)
{
Point1=3621480
Point2=9621480
link(onCreateRect,3864493:doCombine,[])
}
Add(RGN_SetToWindow,7533673,658,308)
{
link(Handle,4167310:Handle,[(664,236)(489,236)])
}
Add(PointXY,152639,420,343)
{
X=40
Y=40
link(X,4167310:Width,[(426,253)(496,253)])
link(Y,4167310:Height,[(433,269)(503,269)])
}
Aziz писал(а):
интересный глюк
Повторить не получилось. Делал так:
1. Зашел в дочернюю форму и скопировал элемент MediaPlayerEx.
2. Вышел на основную форму и вставил MediaPlayerEx.
Правильно понял последовательность действий?
карма: 11

0
Ответов: 1308
Рейтинг: 48
#92: 2025-05-13 23:26:42 ЛС | профиль | цитата
sla8a, спасибо большое, не знал что так можно) У лейбла какой-то особый статус в системе, тк это надпись и ее нельзя перекрывать?
А глюк странно, у меня тоже исчез. А ведь стабильный был - раза 3 крушил Хиасм. А теперь ни следа. Видимо, комп выспался и пришел в себя)
А отключить подобное поведение компонента, сложно? Ну в общем-то мне и твой вариант достаточен, просто вдруг в будущем именно на форму захочется вывести или image. Ну тогда и начну ковырять компонент)
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1308
Рейтинг: 48
#93: 2025-05-14 01:27:31 ЛС | профиль | цитата
Вот, еще один неприятный момент - при ресайзинге окна с включенным видео, оно сбивается, перематывается в разные участки видео и зависает иногда.


Add(Label,516766,819,196)
{
Left=70
Top=35
Width=335
Height=225
Align=5
AutoSize=1
Point(Handle)
}
Add(MainForm,13094838,868,252)
{
Width=507
Height=385
Color=-16777203
Point(onResize)
link(onCreate,1545626:doCreateRect,[])
link(onResize,1216677:doData,[(912,279)(912,314)(814,314)(814,349)])
}
Add(MediaPlayerEx,7794242,819,252)
{
Scale=2
Point(onError)
Point(doScale)
link(Handle,516766:Handle,[])
}
Add(Image,4167310,966,147)
{
Width=491
Height=346
Align=5
Color=15780518
Point(Handle)
Point(Width)
Point(Height)
}
Add(ODialog,6287391,763,252)
{
Filter="All Unknown Types|*.3gp;*.asf;*.avi;*.divx;*.flv;*.m1v;*.m2v;*.mkv;*.mov;*.mp4;*.mpe;*.mpeg;*.mpg;*.mpv;*.ogm;*.qt;*.ram;*.rm;*.rv;*.swf;*.vob;*.wm;*.wmv;*.aac;*.ac3;*.aif;*.aifc;*.aiff;*.ape;*.au;*.flac;*.it;*.kar;*.lxm;*.m4a;*.mid;*.midi;*.mka;*.mod;*.mp1;*.mp2;*.mp3;*.mpa;*.mpc;*.ogg;*.ra;*.rmi;*.s3m;*.snd;*.stm;*.wav;*.wv;*.wma;*.xm;*.bmp;*.jpeg;*.jpg|All Files|*.*"
Title=""
StartDir=""
FileName=""
link(onExecute,7794242:doOpen,[])
}
Add(Button,5485962,707,252)
{
Left=5
Top=280
Height=45
link(onClick,6287391:doExecute,[])
}
Add(RGN_Rect,1545626,980,266)
{
Point2=100
link(onCreateRect,5949742:doCreateRect,[])
link(Point2,152639:Point,[(993,238)(957,238)(957,345)(916,345)])
}
Add(RGN_Combine,3864493,1092,266)
{
Mode=2
link(onCombine,7533673:doSetRegion,[])
link(Region1,1545626:Result,[(1098,254)(1132,254)(1132,309)(986,309)])
}
Add(RGN_Rect,5949742,1036,266)
{
Point1=3621480
Point2=9621480
link(onCreateRect,3864493:doCombine,[])
}
Add(RGN_SetToWindow,7533673,1148,266)
{
link(Handle,4167310:Handle,[(1154,194)(979,194)])
}
Add(PointXY,152639,910,301)
{
X=40
Y=40
link(X,4167310:Width,[(916,211)(986,211)])
link(Y,4167310:Height,[(923,227)(993,227)])
}
Add(DoData,1216677,826,343)
{
Data=Integer(2)
link(onEventData,7794242:doScale,[(870,349)(870,321)(807,321)(807,293)])
}

карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
1
Голосовали:sla8a
Ответов: 2407
Рейтинг: 691
#94: 2025-05-14 09:46:06 ЛС | профиль | цитата
Aziz писал(а):
неприятный момент
Да действительно есть такое безобразие, видео скачет как ему вздумается. В Media.pas было задокументировано что при стартовой позиции -1 продолжит воспроизведение с того же места, что и использовалось в элементе. Переделал этот момент, обновил архив в первом посте (замен Media.pas обязательна).
Aziz, onResize лучше использовать того элемента на котором видео:
Add(Label,516766,245,196)
{
Left=70
Top=35
Width=335
Height=225
Align=5
AutoSize=1
Point(Handle)
Point(onResize)
link(onResize,1216677:doData,[(328,209)(328,345)(175,345)(175,293)])
}
Add(MainForm,13094838,392,259)
{
Width=507
Height=385
Color=-16777203
Point(onResize)
link(onCreate,1545626:doCreateRect,[])
}
Add(MediaPlayerEx,7794242,245,252)
{
Scale=2
Point(onError)
Point(doScale)
link(Handle,516766:Handle,[])
}
Add(Image,4167310,490,154)
{
Width=491
Height=346
Align=5
Color=15780518
Point(Handle)
Point(Width)
Point(Height)
}
Add(ODialog,6287391,189,252)
{
Filter="All Unknown Types|*.3gp;*.asf;*.avi;*.divx;*.flv;*.m1v;*.m2v;*.mkv;*.mov;*.mp4;*.mpe;*.mpeg;*.mpg;*.mpv;*.ogm;*.qt;*.ram;*.rm;*.rv;*.swf;*.vob;*.wm;*.wmv;*.aac;*.ac3;*.aif;*.aifc;*.aiff;*.ape;*.au;*.flac;*.it;*.kar;*.lxm;*.m4a;*.mid;*.midi;*.mka;*.mod;*.mp1;*.mp2;*.mp3;*.mpa;*.mpc;*.ogg;*.ra;*.rmi;*.s3m;*.snd;*.stm;*.wav;*.wv;*.wma;*.xm;*.bmp;*.jpeg;*.jpg|All Files|*.*"
Title=""
StartDir=""
FileName=""
link(onExecute,7794242:doOpen,[])
}
Add(Button,5485962,133,252)
{
Left=5
Top=280
Height=45
link(onClick,6287391:doExecute,[])
}
Add(RGN_Rect,1545626,504,273)
{
Point2=100
link(onCreateRect,5949742:doCreateRect,[])
link(Point2,152639:Point,[(517,245)(481,245)(481,352)(440,352)])
}
Add(RGN_Combine,3864493,616,273)
{
Mode=2
link(onCombine,7533673:doSetRegion,[])
link(Region1,1545626:Result,[(622,261)(656,261)(656,316)(510,316)])
}
Add(RGN_Rect,5949742,560,273)
{
Point1=3621480
Point2=9621480
link(onCreateRect,3864493:doCombine,[])
}
Add(RGN_SetToWindow,7533673,672,273)
{
link(Handle,4167310:Handle,[(678,201)(503,201)])
}
Add(PointXY,152639,434,308)
{
X=40
Y=40
link(X,4167310:Width,[(440,218)(510,218)])
link(Y,4167310:Height,[(447,234)(517,234)])
}
Add(DoData,1216677,189,287)
{
Data=Integer(2)
link(onEventData,7794242:doScale,[])
}

Aziz писал(а):
У лейбла какой-то особый статус в системе, тк это надпись и ее нельзя перекрывать?
Тут боюсь ошибиться, но скорее всего дело в том что с Image они братья, а вот форма для них мама (она и главнее).
Aziz писал(а):
А отключить подобное поведение компонента, сложно?
Могу только предположить что скорее всего да. Но в нашем Media.pas ничего такого нет. Это нужно будет добавлять. Если найдешь что это и как должно быть, то постараюсь добавить. Вот можешь тут поискать:
Команды мультимедиа
Начать поиск наверно с MCI_WINDOW стоит.

Редактировалось 1 раз(а), последний 2025-05-14 09:46:41
карма: 11

0
Ответов: 1308
Рейтинг: 48
#95: 2025-05-15 08:04:38 ЛС | профиль | цитата
sla8a, спасибо огромное, попробую.

--- Добавлено в 2025-05-15 08:18:44

sla8a, все работает, уже не сбивается, кроме повтора - в 1 примере твоем, как доходит до конца отрезка, просто останавливается.

Редактировалось 2 раз(а), последний 2025-05-15 08:19:18
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 2407
Рейтинг: 691
#96: 2025-05-15 10:37:15 ЛС | профиль | цитата
Aziz писал(а):
в 1 примере твоем, как доходит до конца отрезка, просто останавливается.
У себя такого глюка не увидел. Запустил схему Test01, нажал Open, выбрал видео файл, началась проигрывание, дойдя до конца начало с начала.
Если убрать флажок с Replay, то в конце видео останавливается. Или речь о чем-то другом?
карма: 11

0
Ответов: 1308
Рейтинг: 48
#97: 2025-05-15 12:05:47 ЛС | профиль | цитата
Я о повторе выбранного ползунками ОТРЕЗКА, куска видео. Раньше помню работало, можно было до 1 семпла зациклить.

Редактировалось 1 раз(а), последний 2025-05-15 12:06:35
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1308
Рейтинг: 48
#98: 2025-05-16 23:02:19 ЛС | профиль | цитата
Странно, но в моем старом проекте этот повтор работает как и раньше. Наверное что-то упускаю. Почему тогда в вашем примере test1 не работает?

Редактировалось 1 раз(а), последний 2025-05-17 00:36:48
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 2407
Рейтинг: 691
#99: 2025-05-18 13:50:21 ЛС | профиль | цитата
Обновил архив в первом посте.
карма: 11

1
Голосовали:Aziz
Ответов: 1308
Рейтинг: 48
#100: 2025-05-19 04:17:47 ЛС | профиль | цитата
sla8a, круто бы туда добавить реверс) И морфинг кадров чтобы не резко перескакивали при зацикливании..
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 2407
Рейтинг: 691
#101: 2025-05-20 11:58:37 ЛС | профиль | цитата
Aziz, реверс по легкому добавить не получилось. Есть флаг MCI_DGV_PLAY_REVERSE (воспроизведение должно происходить в обратном порядке), но с ним у меня не получилось добиться реверса при проигрывании.
Морфинг кадров точно не буду даже пробовать. Как по мне элемент достиг своего предела, можно еще добавить какие-то мелочи и поправить, то что не будет работать как нужно. Но добавлять новый функционал, сильно перегрузит элемент. Лучше делать другой и как менеджер и уже в него пробовать добавлять такого рода плюшки.
карма: 11

0
Ответов: 1308
Рейтинг: 48
#102: 2025-05-20 16:18:19 ЛС | профиль | цитата
Понял, спасибо! И то что есть, уже круто. А так по идее, где-то просто должен быть обычный счетчик - пойнтер на кадры в памяти, какую-то структуру, но где он... Это уже надо зарываться поглубже. А может, даже сделать этот плеер смыслом своей жизни))

--- Добавлено в 2025-05-20 16:27:45

Спросил оба ИИ:
Почему флаг MCI_DGV_PLAY_REVERSE не работает для Delphi Pascal кода ?

Дипсик
Флаг **`MCI_DGV_PLAY_REVERSE`** в Delphi (Pascal) может не работать по нескольким причинам, связанным с ограничениями MCI (Media Control Interface) и реализацией в Windows.

### Основные причины:
1. **Неподдержка драйвером устройства**
- Не все MCI-драйверы поддерживают воспроизведение в обратном направлении.
- Например, старые версии `mciavi.drv` (драйвер для AVI-файлов) могут игнорировать этот флаг.

2. **Неправильное использование в коде**
- Флаг должен передаваться в функции `mciSendCommand` вместе с `MCI_PLAY`.
- Пример корректного вызова:
```pascal
mciSendCommand(
DeviceID,
MCI_PLAY,
MCI_DGV_PLAY_REVERSE or MCI_WAIT,
0
);
```

3. **Устаревший MCI-интерфейс**
- MCI — это старая технология (ещё со времён Windows 3.1), и Microsoft постепенно отказывается от неё в пользу DirectShow, Media Foundation и др.
- В Windows 10/11 некоторые функции MCI работают некорректно или ограниченно.

4. **Ограничения формата видео**
- Даже если драйвер поддерживает `MCI_DGV_PLAY_REVERSE`, он может не работать для:
- Сжатых кодеков (MPEG-4, H.264).
- Потокового видео (например, из интернета).

---

### Альтернативные решения:
#### 1. **Проверить поддержку флага**
Перед использованием можно запросить возможности устройства:
```pascal
var
CapsParams: MCI_GETDEVCAPS_PARMS;
begin
CapsParams.dwCallback := 0;
mciSendCommand(
DeviceID,
MCI_GETDEVCAPS,
MCI_GETDEVCAPS_ITEM,
Cardinal(@CapsParams)
);
if (CapsParams.dwReturn and MCI_GETDEVCAPS_CAN_PLAY_REVERSE) = 0 then
ShowMessage('Обратное воспроизведение не поддерживается!');
end;
```

#### 2. **Использовать DirectShow или VLC**
Если MCI не работает, лучше перейти на более современные технологии:
- **DirectShow** (через DSPack для Delphi)
- **LibVLC** (библиотека VLC для Delphi)

#### 3. **Эмуляция обратного воспроизведения**
Если нужно именно "перемотка назад", можно:
- Разбить видео на кадры (через AVI-обработку).
- Вручную проигрывать кадры в обратном порядке.

---

### Вывод:
Флаг **`MCI_DGV_PLAY_REVERSE`** может не работать из-за:
1. Отсутствия поддержки драйвером.
2. Устаревания MCI в новых Windows.
3. Ограничений кодека.

**Рекомендация:** Перейти на DirectShow или LibVLC, если требуется надёжное обратное воспроизведение.

ГПТ

Флаг `MCI_DGV_PLAY_REVERSE` (для MCI — Media Control Interface, DGV — Digital Video) **часто не работает в Delphi по ряду причин**, связанных как с самим API, так и с ограничениями проигрываемых форматов и устройств. Вот основные причины:

---

### 1. **Не все устройства поддерживают обратное воспроизведение**

Флаг `MCI_DGV_PLAY_REVERSE` работает **только с устройствами, которые поддерживают** эту возможность. Это:

* **только для цифрового видео** (`digitalvideo`) и некоторых устройств типа AVI.
* **зависит от драйвера MCI**. Большинство стандартных AVI-драйверов Windows **не поддерживают обратное воспроизведение**.

Если вы используете, например, WAV или MPEG-драйвер — этот флаг **игнорируется**.

---

### 2. **Неправильный способ вызова**

В Delphi нужно точно указать устройство и правильно сформировать команду. Пример:

```pascal
mciSendString('play movie reverse', nil, 0, 0);
```

Но:

* `movie` должен быть открыт с помощью `digitalvideo`.
* Не все AVI-файлы совместимы.
* В некоторых случаях надо использовать `MCIWnd` или даже прямую работу через `mciSendCommand`.

---

### 3. **Windows 10/11 больше не поддерживает старые MCI-драйверы**

Функции MCI были **постепенно устаревшими** и не всегда работают корректно на новых системах.

---

### 4. **Пример правильной последовательности команд**

Чтобы попробовать использовать `MCI_DGV_PLAY_REVERSE` в Delphi:

```pascal
var
s: string;
begin
// Открытие AVI файла как digitalvideo
mciSendString('open "C:\video.avi" type digitalvideo alias movie', nil, 0, 0);

// Перемещение в конец
mciSendString('seek movie to end', nil, 0, 0);

// Воспроизведение в обратную сторону
mciSendString('play movie reverse', nil, 0, 0);
end;
```

**Если ничего не происходит или видео не воспроизводится — ваш драйвер/кодек не поддерживает reverse.**

---

### Возможные решения

1. **Проверить формат и драйвер** — попробовать другой AVI, только с raw frames.
2. **Использовать альтернативные библиотеки**, например:

* **DirectShow** (через `DirectShow9.pas`)
* **FFmpeg** (через DLL или wrapper)
* **MPlayer/Mpv** — с управлением через консольные команды.
3. **Сымитировать обратное воспроизведение**, декодируя кадры вручную и проигрывая их в обратном порядке (сложно, но гибко).

---

### Заключение

Флаг `MCI_DGV_PLAY_REVERSE` в Delphi **чаще всего не работает**, потому что:

* используется неподходящий драйвер,
* файл не поддерживает реверс,
* или Windows не предоставляет нужную поддержку.

Для надёжного результата лучше использовать **DirectShow или FFmpeg**, особенно если нужен контроль над воспроизведением видео в обратную сторону.

Хочешь пример с DirectShow или FFmpeg для обратного воспроизведения?

Ссылка на чат: https://chatgpt.com/share/682c86d2-4a9c-8003-a628-e5667b0e4beb


Редактировалось 8 раз(а), последний 2025-05-20 16:43:36
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 2407
Рейтинг: 691
#103: 2025-05-20 16:43:24 ЛС | профиль | цитата
Aziz, дипсик прав, по первому же пункту. В media.pas реализована проверка на возможность реверса, и у меня она постоянно выдавала false. Да и в третьем пункте все верно. MCI уже устаревшая, о чем и информируют на сайтах мелкомягких.
для большинства задач, данного компонента более чем хватает. А для чего посерьёзнее надо другой делать.
Aziz писал(а):
должен быть обычный счетчик - пойнтер на кадры в памяти, какую-то структуру, но где он
Не встречалось мне такое.

Редактировалось 3 раз(а), последний 2025-05-20 16:47:34
карма: 11

0
Ответов: 1308
Рейтинг: 48
#104: 2025-05-20 16:45:38 ЛС | профиль | цитата
sla8a, в общем, будем ваять копипастом)) через окольные пути) Там ссылку на чат с ГПТ оставил, можно будет потом код оттуда брать рабочий.

Редактировалось 1 раз(а), последний 2025-05-20 16:45:57
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 2407
Рейтинг: 691
#105: 2025-05-20 16:57:25 ЛС | профиль | цитата
Aziz, поскольку помню то в HiAsm есть и DirectShow и FFmpeg (сейчас не за компьютером). А там не смотрел реверс?
карма: 11

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)