Вверх ↑
Ответов: 1309
Рейтинг: 48
#1: 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

карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Редактировалось 8 раз(а), последний 2025-05-20 16:43:36