FreePascal FFmpeg, запущенный TProcess, перестает работать - PullRequest
0 голосов
/ 18 октября 2018

Я создаю TPorocess для ffmpeg для потоковой передачи видео из / dev / video0 в Linux Ububntu 14.04.После 5 минут работы отправка потока прекращается, и на принимающей стороне (ffplay) картинка зависает.

Странная вещь - если я пытаюсь прочитать стандартный вывод ffmpeg с помощью cat / procs / 3535 (где 3535 - ffmpegPID) он продолжает работать, и клиент снова видит живое изображение!После следующих 5 минут работы эта ситуация повторяется.И снова помогает вызов read stdout.

Когда я передаю аудиопоток таким же образом, этого не происходит.Когда я запускаю потоковое видео ffmpeg с терминала, оно работает без проблем!

ОС Linux Ubuntu 14.04 32-bit.FFmpeg v3.4, собранный с GCC 4.8

Стартовая строка FFmpeg: ffmpeg -vsync drop -frame_drop_threshold 1 -f v4l2 -video_size 640x480 -i /dev/video0 -vcodec libx264 -pix_fmt yuv420p -tune zerolatency -preset ultrafast -b 500k -fflags +genpts -f rtp rtp://10.0.6.70:2666

Свободный код Паскаля:

  FVideoTranslation := TProcessUTF8.Create(nil);
  FVideoTranslation.Options := [poUsePipes]; 
  with FVideoTranslation do
  begin
    Executable := Format(PATH_PATTERN, [FProgramPath, TRANSLATION_PROGRAM]);
    Parameters.Add('-vsync');
    Parameters.Add('drop');
    Parameters.Add('-frame_drop_threshold');
    Parameters.Add('1');
    DeviceParams := GetCaptureParam(AVideoDevice, dtVideo);
    for i := 0 to DeviceParams.Count - 1 do
      Parameters.Add(DeviceParams[i]);
    FreeAndNil(DeviceParams);
    Parameters.Add('-vcodec');
    Parameters.Add('libx264');
    Parameters.Add('-pix_fmt');
    Parameters.Add('yuv420p');
    Parameters.Add('-tune');
    Parameters.Add('zerolatency');
    Parameters.Add('-preset');
    Parameters.Add('ultrafast');
    Parameters.Add('-b');
    Parameters.Add('500k');
    Parameters.Add('-fflags');
    Parameters.Add('+genpts');
    Parameters.Add('-f');
    Parameters.Add('rtp');
    Parameters.Add('rtp://%s:%d', [AAbonentIp, AVideoPort]);     
    Execute();
    Log.AddMessage(Parameters.Text);
  end;      
  SdpInfo.Clear;
  while (SdpInfo.Count = 0) do
  try
    SdpInfo.LoadFromStream(FVideoTranslation.Output);
  except
    on E: Exception do
      Log.AddMessage('VideoTranslation.Output: ' + E.Message);
  end;
  Log.AddMessage(SdpInfo.Text);
  FVideoFile := SdpInfo.Text;

Есть предложения, почему это может быть?

...