Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > TMediaPlayer


Автор: sergeboss 9.7.2003, 01:47
Есть динамический массив a, который содержит имена файлов (1.avi, 2.avi, ..... n.avi).
Как заставить TMediaPlayer проиграть все файлы по очереди?
Заранее спасибо!

Автор: cot 9.7.2003, 05:45
var i:integer;
...........
for i:=0 to Length(DinMass)-1 do
MediaPlayer1.Play(DinMass[i])
end;
Как то так. На работоспособность не проверял.

Автор: sergeboss 9.7.2003, 07:29
К сожалениею это далеко не так.....

Автор: Kesh 9.7.2003, 08:18
Если использование TMediaPlayer не принципиально, то могу посоветовать использовать компоненты DSPACK, заточенные для проигрывания свяческих видеофайлов (включая DVD), для работы требуется DirectX 9.0, точнее DirectShow 9.0.

Подробнее читай здесь...
DSPACK - http://www.progdigy.com/
DirectX 9.0 SDK for Delphi - http://clootie.narod.ru/

Будут вопросы, пиши...

Автор: B2_Russia 9.7.2003, 15:01
Слушай сюда.

У TMediaPlayer имеется свойство Mode.
Короче говоря тебе перед загрузкой нового трека (avi) нужно узнать закончился ли предыдущий.
Предлагаю обработать событие OnNotify:

const

ModeStr: array[TMPModes] of string = ('Not ready', 'Stopped', 'Playing', 'Recording', 'Seeking', 'Paused', 'Open');

procedure TForm1.MediaPlayer1Notify(Sender: TObject);

begin
with Sender as TMediaPlayer do
begin
Form1.Caption := ModeStr[Mode];
{ Note we must reset the Notify property to True }
{ so that we are notified the next time the }
{ mode changes }
Notify := True;
end;
end;


Это я скопировал из Helpа по Delphi разберешься?

Здесь проверь на Stopped и запускай новый трек если предыдущий не был прерван юзером.

Надеюсь помог

Автор: sergeboss 9.7.2003, 23:41
И это я все пробовал..... вот именно здесь, я даю новое имя файла из массива, но он не открывает его, а проигрывает старый!

Автор: Pakshin A. S. 10.7.2003, 22:26
Работает на 100%:
Код

 ...
 MediaPlayer1.Close;
 MediaPlayer1.FileName:=YourFileName;
 MediaPlayer1.Open;
 ...


P. S.
Что насчёт проигравания по очереди, сам думай...

Автор: Pakshin A. S. 10.7.2003, 22:28
Соответсвенно пользуйся MediaPlayer1.Play и MediaPlayer1.Stop

Автор: &-ray 10.7.2003, 23:27
Я делал так:
установил таймер с интервалом 100мс и проверял MediaPlayer.Position,
как только MadiaPlayer.position:=mediaplayer.length, значит пора менять пластинку (принцип как указал Pakshin A. S.), только вместо
MediaPlayer1.FileName:=YourFileName;
подставляешь значение из массива:
MediaPlayer1.FileName:=SongArray[currentsong+1]
, где currentsong - индекс текущей песни в массиве.

ЗЫ По этому же таймеру можно менять положение TrackBar.Position (если нужно отображать процесс проигрывания)

Автор: sergeboss 11.7.2003, 10:12
procedure TForm3.MediaPlayer1Notify(Sender: TObject);
begin
with MediaPlayer1 do
begin
if Mode=mpStopped then
begin
Stop;
Close; - вот здесь постоянно возникает ошибка!!!!! application-defined exeception (code 0xc0000008)
FileName:=c[2]+'.avi';
Open;
Play;
Notify:=true;
end;
end;
end;

Автор: Akella 11.7.2003, 12:57
Цитата
Close; - вот здесь постоянно возникает ошибка!!!!! application-defined exeception (code 0xc0000008)

А если убрать эту строку, ты пробовал? Без закрытия, сразу открытие нового файла и проигрывание.

Автор: sergeboss 11.7.2003, 16:16
Тогда он проигрывает не новый - а старый файл.... И ничего не могу сдлать, пробовал так же и с таймером... ошибка все таже!

Автор: &-ray 11.7.2003, 23:50
У меня с таймером все ОК.
Может надо со свойствами проигрывателя чего мутить, у меня такие:
AutoEnable:=true;
AutoOpen:=false;
AutoRewind:=true;

ЗЫ По таймеру после проверки позиции проигрывания плеера просто останавливаю его
mediaplayer.stop
, затем прописывал файл для проигрывания
mediaplayer.filename:=...
, потом открываю
mediaplayer.open
mediaplayer.play

У меня все работает smile.gif


Автор: Pakshin A. S. 11.7.2003, 21:28
Убери Stop, ведь при выполнении Close MediaPlayer сам себя останавливает.

Автор: cot 12.7.2003, 08:07
Прошу прощения за предыдущий бестолковый ответ. Вот это работает, проверено:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MPlayer;

type
TfmPlayer = class(TForm)
btSelect: TButton;
cbMass: TComboBox;
OpenDialog1: TOpenDialog;
btPlay: TButton;
MediaPlayer1: TMediaPlayer;
procedure btSelectClick(Sender: TObject);
procedure btPlayClick(Sender: TObject);
procedure MediaPlayer1Notify(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure PlayMass(Ind:integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
fmPlayer: TfmPlayer;

implementation

{$R *.dfm}
var i:integer;
procedure TfmPlayer.btSelectClick(Sender: TObject);
begin
if OpenDialog1.Execute then
cbMass.Items.Add(OpenDialog1.Filename);
cbMass.Text:=cbMass.Items[0]
end;
procedure TfmPlayer.PlayMass(Ind:integer);
begin
if cbMass.Items.Count>Ind then
with MediaPlayer1 do begin
Notify:=false;
FileName:= cbMass.Items[Ind];
Open;Play;Notify:=true
end;
end;
procedure TfmPlayer.btPlayClick(Sender: TObject);
begin
PlayMass(i)
end;

procedure TfmPlayer.MediaPlayer1Notify(Sender: TObject);
begin
Inc(i);PlayMass(i)
end;
procedure TfmPlayer.FormCreate(Sender: TObject);
begin
i:=0
end;

procedure TfmPlayer.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
MediaPlayer1.Close
end;

end.

Автор: sergeboss 25.7.2003, 10:43
большое спасибо всем, кто принял участие в обсуждении данной темы!

Автор: lacost 7.12.2008, 20:16
Не хочу создавать ещё оду тему по этому компоненту но возникли следующие вопросы:

Как определить время звучаия файла?
свойство Position я тау понимаю показывает текущий номер байта..если так можно сказать а свойство Length я так понимаю размер файла в байтах, или я ошибаюсь?

Ещё такой вопрос сделал регулировку звука в MP как предлагает DRKB но для миди файлов звук не регулируется, как быть?

Зарание спасибо за ответы.


M
Alexeis
Модератор: Пожалуйста, один топик - один вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)