Tprocess + Mplayer - не могу получить информацию из output

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Tprocess + Mplayer - не могу получить информацию из output

Сообщение rellai2 » 18.09.2008 11:54:05

Доброе время суток.
Хочу воспроизвести файл в Mplayer для этого
создаю процесс:
Код: Выделить всё
procedure TMplayerClass.play(index:string);
var Mplayeroptions: String;
begin
  if FPlaying then stop;
  MplayerProcess:=TProcess.Create(nil);
  Mplayeroptions:='-slave -quiet';
  MplayerProcess.CommandLine:=MplayerPatch+' '+MplayerOptions+' '+index;
  MplayerProcess.Options:= [poUsePipes, poNoConsole];
  MplayerProcess.Execute;
  if MplayerProcess.Running then
  begin
    FPlaying:=true;
  end;
end;       

Если я хочу получить информацию которую выводит Mplayer я использую эту функцию
Код: Выделить всё
function TMplayerClass.GetProcessOutput: string;
var AStringList: TStringList;
Buffer: string;
    BytesAvailable: DWord;
    BytesRead:LongInt;
    NoMoreOutput: boolean;
begin
   AStringList:=TStringList.Create;
   try
      if GetMPlayerPlaying then begin
    repeat
      NoMoreOutput := true;
      BytesAvailable := MPlayerProcess.Output.NumBytesAvailable;
      BytesRead := 0;
      while BytesAvailable>0 do
      begin
        SetLength(Buffer, BytesAvailable);
        BytesRead := MPlayerProcess.OutPut.Read(Buffer[1], BytesAvailable);
        AStringList.Text := AStringList.Text + copy(Buffer,1, BytesRead);
        BytesAvailable := MPlayerProcess.Output.NumBytesAvailable;
        NoMoreOutput := false;
      end;
    until noMoreOutput;
    end;
        Result:=AStringList.text;
   except
   result:='';
   end;
   AStringList.Free;
end;   

Когда я запускаю эту функцию непосредственно после запуска mplayer то я получаю то что он выводит в консоль.
Но если послать комманду Mplayer, то GetProcessOutput возвращает пустую строку
комманду посылаю след образом
Код: Выделить всё
procedure TMplayerClass.SendCommand(cmd: string);
begin
   cmd:=cmd+LineEnding;
   try
     if GetMPlayerPlaying then MplayerProcess.Input.write(cmd[1], length(cmd));
   except writeln('Ошибка посылки комманды Mplayer');
   end;
end;   

Тоесть если я пишу SendCommand('get_time_length'); то при вызове GetProcessOutput я получаю пустую строку...
А мне нужно получить то что выдаст мплеер...
В чем может быть проблема???

система Winxp, lazarus 0.9.25 trunc(16.09.2008) fpc 2.2.2
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: Tprocess + Mplayer - не могу получить информацию из output

Сообщение B4rr4cuda » 18.09.2008 14:34:54

А ошибка не тут случаем?
rellai2 писал(а):if GetMPlayerPlaying then MplayerProcess.Input.write(cmd[1], length(cmd));
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Tprocess + Mplayer - не могу получить информацию из output

Сообщение rellai2 » 18.09.2008 15:45:28

B4rr4cuda писал(а):А ошибка не тут случаем?
rellai2 писал(а):if GetMPlayerPlaying then MplayerProcess.Input.write(cmd[1], length(cmd));


Нет...
если указать cmd[0] то выдает ошибкуЖ
mplayer.pas(108,64) Error: Element zero of an ansi/wide- or longstring can't be accessed, use (set)length instead

если cmd просто указать то тоже получаю снова пустую строку...
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: Tprocess + Mplayer - не могу получить информацию из output

Сообщение B4rr4cuda » 18.09.2008 16:10:56

Тогда уж не
(cmd[1], length(cmd));

и не
(cmd[0], length(cmd));

а
Код: Выделить всё
if GetMPlayerPlaying then
for i:=1 to length(cmd) do
MplayerProcess.Input.write(cmd[i], length(cmd[i]));


Я пару месяцев назад пробовал TProcess - вывода не было вообще, поэтому использовал класс TExProcess найденный здесь же на форуме. Пример использования тут.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Tprocess + Mplayer - не могу получить информацию из output

Сообщение rellai2 » 19.09.2008 12:35:11

Код: Выделить всё
if GetMPlayerPlaying then
for i:=1 to length(cmd) do
MplayerProcess.Input.write(cmd[i], length(cmd[i]));

Сделал так же результат не поменялся...

Я пару месяцев назад пробовал TProcess - вывода не было вообще, поэтому использовал класс TExProcess найденный здесь же на форуме. Пример использования тут.


Прбовал использовать и этот код в проекте, но получаю все равно пустую строку....:
Код: Выделить всё
  repeat
    SetLength(buf, buf_len);
    SetLength(buf, p.output.Read(buf[1], length(buf))); //waits for the process output
     // cut the incoming stream to lines:
    s:=s + buf; //add to the accumulator
    repeat //detect the line breaks and cut.
      i:=Pos(#13, s);
      j:=Pos(#10, s);
      if i=0 then i:=j;
      if j=0 then j:=i;
      if j = 0 then Break; //there are no complete lines yet.
      OnReadLn(Copy(s, 1, min(i, j) - 1)); //return the line without the CR/LF characters
      s:=Copy(s, max(i, j) + 1, length(s) - max(i, j)); //remove the line from accumulator
    until false;
  until buf = ''; 
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: Tprocess + Mplayer - не могу получить информацию из output

Сообщение B4rr4cuda » 19.09.2008 13:24:27

Тогда задам глупый вопрос: а должно ли получаться что-то еще, кроме пустой строки?
Больше ничего сказать пока не могу. Выложи юнит полностью - поковыряю на выходных.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Tprocess + Mplayer - не могу получить информацию из output

Сообщение rellai2 » 19.09.2008 22:04:04

B4rr4cuda писал(а):Тогда задам глупый вопрос: а должно ли получаться что-то еще, кроме пустой строки?
Больше ничего сказать пока не могу. Выложи юнит полностью - поковыряю на выходных.

Ну если верить документации к Mplayer то должно :))

проверил под линуксом - все работает. проблема только под виндой
только вот Get_FileLength одно значение все выдает - 300000000... странно все это :)))
У вас нет необходимых прав для просмотра вложений в этом сообщении.
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: Tprocess + Mplayer - не могу получить информацию из output

Сообщение B4rr4cuda » 20.09.2008 02:38:59

Не знаю, как у тебя, а у меня под лином, вообще веселая хня творится - input стрим большую часть времени вообще не пашет.
Количество доступных байт, при чтении выходного потока, зависит, видимо, от погоды в Китае.
Ненавижу FreePascal-евский TProcess.
Без опции мплеера -quiet, можно получить стабильный вывод, но при попытке использовать оба пайпа - труба.
Хз, чего они там намудрили. Боюсь, что ничем помочь не могу.

Мну сдается и идет дальше изучать Ogre3D и плюсы.

PS: Весьма порадовало объявление пайпов в классе TProcess:
Код: Выделить всё
FInputStream  : TOutputPipeStream;
    FOutputStream : TInputPipeStream;
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Tprocess + Mplayer - не могу получить информацию из output

Сообщение rellai2 » 20.09.2008 11:49:43

B4rr4cuda писал(а):Не знаю, как у тебя, а у меня под лином, вообще веселая хня творится - input стрим большую часть времени вообще не пашет.
Количество доступных байт, при чтении выходного потока, зависит, видимо, от погоды в Китае.
Ненавижу FreePascal-евский TProcess.
Без опции мплеера -quiet, можно получить стабильный вывод, но при попытке использовать оба пайпа - труба.
Хз, чего они там намудрили. Боюсь, что ничем помочь не могу.

Мну сдается и идет дальше изучать Ogre3D и плюсы.

PS: Весьма порадовало объявление пайпов в классе TProcess:
Код: Выделить всё
FInputStream  : TOutputPipeStream;
    FOutputStream : TInputPipeStream;


ЭЭЭх грустна :(
А еще как нить можно подрубиться к нему либо еще к какой нить либе, только чтоб не очень проблемно было?

p.s. Я тут книжку нашел в книжном по qt4 думаю может прикупить :) только дорогая зараза ))
rellai2
постоялец
 
Сообщения: 135
Зарегистрирован: 18.09.2008 11:37:45

Re: Tprocess + Mplayer - не могу получить информацию из output

Сообщение B4rr4cuda » 20.09.2008 20:57:10

Ну, можно ещё свою реализацию подключения по пайпам сделать :).
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65

Рейтинг@Mail.ru