{
MCI-проигрыватель видеофайлов
Данный проигрыватель использует интерфейс командный строк
}
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, MMSystem, ComCtrls, ExtCtrls, Spin;
type
TFormMain = class(TForm)
BitBtnPlay: TBitBtn;
BitBtnStop: TBitBtn;
Timer: TTimer;
Label1: TLabel;
StatusBar: TStatusBar;
BitBtnLoadFile: TBitBtn;
OpenDialog: TOpenDialog;
ScrollBar: TScrollBar;
StaticTextTime: TStaticText;
StaticTextPos: TStaticText;
Label2: TLabel;
Label3: TLabel;
procedure BitBtnPlayClick(Sender: TObject);
procedure BitBtnStopClick(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure BitBtnLoadFileClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
ErrMsg : array[0..4095] of Char;
ErrMsgStr : String;
AVILength : Cardinal; // Длина видео
public
{ Public declarations }
ErrorID : DWORD; // ID ошибки
FlgOpen : Boolean;
CommandStr : String; // Командная строка
ReturnStr : array[0..50] of Char; // Возвращаемая строка
Ret : String; // Возвращаемая строка
Procedure OpenFile(FileName : String); // Инициализация MCI
Procedure CloseMCIDevice;
Procedure ShowMCIError;
// Проиграть с заданной позиции
procedure Play(Position : Cardinal);
// стоп
Procedure Stop;
// Проигрыватель играет - да / нет
Function IsPlay : Boolean;
// Разрешение / запрет кнопок
Procedure OnOff(Value : Boolean);
end;
var
FormMain: TFormMain;
implementation
uses Wind,UnitStr;
{$R *.dfm}
function MillisecondsToTimeStr(TimeSec: Cardinal): String;
var
H,M,S : Integer;
HStr,MStr,SStr : String[2];
begin
TimeSec := TimeSec div 1000; // в секунды
// Кол-во часов
H := (TimeSec div 60) div 60;
// минуты - (кол-во часов * 60)
M := (TimeSec div 60) - (60*H);
// Cек - общее кол-во секунд + (кол-во мин. * 60))
S := TimeSec - ((TimeSec div 60) * 60);
HStr := IntToStr(H);
IF Length(HStr)=1 then HStr := '0' + HStr;
MStr := IntToStr(M);
IF Length(MStr)=1 then MStr := '0' + MStr;
SStr := IntToStr(S);
IF Length(SStr)=1 then SStr := '0' + SStr;
Result := Format('%S:%S:%S',[HStr,MStr,SStr]);
end;
procedure TFormMain.FormCreate(Sender: TObject);
begin
OnOff(False);
end;
procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IF FlgOpen then
begin
CloseMCIDevice;
FlgOpen := False;
end;
end;
// Закрываем устройство
procedure TFormMain.CloseMCIDevice;
begin
Stop; // Остановить на всякий сучай
// Закрыть
CommandStr := Format('Close video',[]);
ErrorID := mciSendString(PChar(CommandStr),nil, 0, 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
OnOff(False);
end;
// Загрузить
procedure TFormMain.BitBtnLoadFileClick(Sender: TObject);
begin
IF FlgOpen Then
begin
CloseMCIDevice;
end;
IF OpenDialog.Execute then
begin
OpenFile(OpenDialog.FileName);
end;
end;
// Открыть MCI устройство и загрузить файл
procedure TFormMain.OpenFile(FileName: String);
var
Coord : TSepRec;
begin
// Загружаем файл
CommandStr := Format('Open "%S" type avivideo alias video Parent %D style child',[FileName, Window.Handle]);
ErrorID := mciSendString(PChar(CommandStr),nil, 0, 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
// Устанавливаем формат времени
CommandStr := Format('Set video time format milliseconds',[]);
ErrorID := mciSendString(PChar(CommandStr),nil, 0, 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
// Получаем длину проигрываемого файла в
CommandStr := Format('Status video length',[]);
ErrorID := mciSendString(PChar(CommandStr),ReturnStr, Length(ReturnStr), 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
SetString(Ret, ReturnStr, StrLen(ReturnStr));
// Получить длину
AVILength := StrToInt(Ret);
ScrollBar.Min := 0;
ScrollBar.Max := AVILength;
ScrollBar.Position := ScrollBar.Min;
StaticTextTime.Caption := MillisecondsToTimeStr(AVILength);
StatusBar.SimpleText := FileName;
FlgOpen := True;
// Определяем высоту и ширину выводимого изображения
CommandStr := Format('Where video destination',[]);
ErrorID := mciSendString(PChar(CommandStr),ReturnStr, Length(ReturnStr), 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
SetString(Ret, ReturnStr, StrLen(ReturnStr));
// Разбиваем строку на элементы
Coord := GetSeparatorRec(Ret,' ');
// Нестраиваем окно проигрыватель
Window.Width := StrToInt(Coord.Rec[3]) + 7; // поправки
Window.Height := StrToInt(Coord.Rec[4]) + 24;
Window.Left := (Left + (Width div 2)) - (Window.Width Div 2);
Window.Top := top - Window.Height;
Window.Show;
// Обновляем окно видео
CommandStr := Format('put video window at %S',[Ret]);
ErrorID := mciSendString(PChar(CommandStr),nil, 0, 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
OnOff(True);
end;
// Проиграть
procedure TFormMain.BitBtnPlayClick(Sender: TObject);
begin
Play(ScrollBar.Position);
end;
procedure TFormMain.Play(Position: Cardinal);
begin
// Загружаем файл
CommandStr := Format('Play video from %D',[Position]);
ErrorID := mciSendString(PChar(CommandStr),nil, 0, 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
Timer.Enabled:= True;
end;
// Стоп
procedure TFormMain.Stop;
begin
CommandStr := Format('Stop video',[]);
ErrorID := mciSendString(PChar(CommandStr),nil, 0, 0);
Timer.Enabled := False;
end;
procedure TFormMain.BitBtnStopClick(Sender: TObject);
begin
Stop;
end;
// ОПРЕДЕЛЕНИЕ ТЕКУЩЕЙ ПОЗИЦИИ В МЕДИА-ДАННЫХ
procedure TFormMain.TimerTimer(Sender: TObject);
begin
// Получаем текущею позицию в медиа-данных
CommandStr := Format('Status video Position',[]);
ErrorID := mciSendString(PChar(CommandStr),ReturnStr, Length(ReturnStr), 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
SetString(Ret, ReturnStr, StrLen(ReturnStr));
ScrollBar.Position := StrToInt(Ret);
StaticTextPos.Caption := MillisecondsToTimeStr(ScrollBar.Position);
end;
// ПОКАЗ ОШИБОК
procedure TFormMain.ShowMCIError;
begin
mciGetErrorString(ErrorID, ErrMsg, SizeOf(ErrMsg));
SetString(ErrMsgStr, ErrMsg, StrLen(ErrMsg));
ShowMessage('Ошибка MCI!' + #10#13 + ErrMsgStr);
end;
/ Проигрыватель играет (ДА/НЕТ)
function TFormMain.IsPlay: Boolean;
begin
Result := False;
CommandStr := Format('Status video Mode',[]);
ErrorID := mciSendString(PChar(CommandStr),ReturnStr, Length(ReturnStr), 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
SetString(Ret, ReturnStr, StrLen(ReturnStr));
Result := Trim(Ret) = 'playing';
end;
// СМЕНА ПОЗИЦИИ
procedure TFormMain.ScrollBarScroll(Sender: TObject;
ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
// Конец перетаскивания бегунка
IF ScrollCode = scEndScroll then
Begin
// Если проигрыватель играет то продолжить игру с позиции бегунка
// иначе
// Просто позиционирование на выбранное время
IF IsPlay then
begin
Play(ScrollBar.Position)
end
else
begin
CommandStr := 'seek video to ' + IntToStr(ScrollBar.Position);
ErrorID := mciSendString(PChar(CommandStr),nil, 0, 0);
IF ErrorID <> 0 then
begin
ShowMCIError; Exit;
end;
end;
end
else
Timer.Enabled := False;
end;
procedure TFormMain.OnOff(Value: Boolean);
begin
BitBtnPlay.Enabled := Value;
BitBtnStop.Enabled := Value;
ScrollBar.Enabled := Value;
end;
end.
проигрывание Mpeg на панели Delphi
Файлы mpeg проигрываются обычным Windows Media проигрывателем, а вот в моей программе с помощью компонента TMediaPlyer на панель выводится только черное окно и никакой картинки. В чем проблема?:confused: :confused:
если ты пытаешся проиграть мпег через медиаплеер, то можешь забить на это занятие. для этого надо использовать MCI. в принципе могут подойти функции для работы с ави. исходник прилагаю.
С AVI файлами никаких проблем, все играет, а необходимо именно mpg (не mpeg. Прошу прощенья за ошибочку) кодек как я понимаю установлен, иначе не проигрывался бы файл другими средствами.
на других форумах все сводится к тому что если кодек установлен, все должно быть по правилам а в реальности черная панель, хотя по значкам компонента что-то проигрывается.
Если есть шансы решить эту проблему пошлите на мой email: [email]leolas@list.ru[/email]
Windows Media Player выводит видео сразу на видекарту (overlay) может с этим какие проблеммы.
вот исходник
Ваши функции все работают! Большое спасибо за Вашу помощь. При замене Window.Handle на Handle моей панели видео выводится куда надо. Но задача у меня смотреть два файла на разных панелях, а через mciSendString это не удается вторая панель не работает до тех пор пока не выключена первая. Так что пришлось таки использовать TMediaPlayer там все получается. mpg файл пока запустить не удалось, но с помощью k-lite codec basic обнаружила что кодек моего файла MPEG-2 не установлен. Порывшись удалось установить что таких кодеков существует несколько разных производителей, какой мой наверно придется устанавливать эмпирическим путем. Непонятно как его в этом случае WindowsMedia плеер проигрывает. :rolleyes:
Цитата: leola
Что то глючит у меня этот сайт. Второй раз набираю ответ.
Ваши функции все работают! Большое спасибо за Вашу помощь. При замене Window.Handle на Handle моей панели видео выводится куда надо. Но задача у меня смотреть два файла на разных панелях, а через mciSendString это не удается вторая панель не работает до тех пор пока не выключена первая. Так что пришлось таки использовать TMediaPlayer там все получается. mpg файл пока запустить не удалось, но с помощью k-lite codec basic обнаружила что кодек моего файла MPEG-2 не установлен. Порывшись удалось установить что таких кодеков существует несколько разных производителей, какой мой наверно придется устанавливать эмпирическим путем. Непонятно как его в этом случае WindowsMedia плеер проигрывает. :rolleyes:
Ваши функции все работают! Большое спасибо за Вашу помощь. При замене Window.Handle на Handle моей панели видео выводится куда надо. Но задача у меня смотреть два файла на разных панелях, а через mciSendString это не удается вторая панель не работает до тех пор пока не выключена первая. Так что пришлось таки использовать TMediaPlayer там все получается. mpg файл пока запустить не удалось, но с помощью k-lite codec basic обнаружила что кодек моего файла MPEG-2 не установлен. Порывшись удалось установить что таких кодеков существует несколько разных производителей, какой мой наверно придется устанавливать эмпирическим путем. Непонятно как его в этом случае WindowsMedia плеер проигрывает. :rolleyes:
Извините, вы уж определитесь что вам конкретно надо?
MPEG-2 это то что на dvd, файлы *.vob.
Цитата: kosfiz
leola
MPEG-2 это то что на dvd, файлы *.vob.
MPEG-2 это то что на dvd, файлы *.vob.
Нет, расширение у меня mpg. Файл получаю с платы видеозахвата. Gotview PCI DVD2 Lite он сам внутри себя содержит микросхемку, которая кодирует файл. Моя задача вывести этот файл в своей програмке на компанент панель + все его данные по времени и все что его касается и таких панелей в проге 2 и фильмы на них разные а идти должны одновременно :eek:
с помощью этой программки посмотри какой кодек нужен для твоего файла и установлен ли он. у меня, например, всем файлам с расширением mpg требуется кодек MPEG-1, а MPEG-2 нужен для просмотра *.vob. кстати если для твоего файла нужен MPEG-2, то с помощью TMediaPlayer файл проиграть скорее всего не удастся.
Это опять я. Наконец-то установила декодер и кодек это ffdchow MPEG-4 Video Decoder. K-lite теперь обнаруживает что видео декодер установлен, но в программе при попытке открыть Player c DeviceType =dtDigitalVideo пишет что указанное устройство не опознается интерфейсом MCI. Может кто что знает где еще надо что прописать чтоб MMSYSTEM знало что декодер установлен или еще чего не хватает?
Это опять я. Наконец-то установила декодер и кодек это ffdchow MPEG-4 Video Decoder. K-lite теперь обнаруживает что видео декодер установлен, но в программе при попытке открыть Player c DeviceType =dtDigitalVideo пишет что указанное устройство не опознается интерфейсом MCI. Может кто что знает где еще надо что прописать чтоб MMSYSTEM знало что декодер установлен или еще чего не хватает?
Format('Open "%S" type avivideo alias video Parent
на Format('Open "%S" type mpegvideo alias video Parent
то мой файл mpg проигрывается Ура!
Но как теперь второй файл запустить??:confused:
Ошибка :выбранный псевдоним уже используется программой, а что нужно изменить не пойму, вроде все имена другие. как сделать клон MCIDevice:confused:
Я то чисто интуитивным путем делала изменения и добилась своего. А хотелось бы знать первоисточники.:eek: