Как писать в fifo в цикле while и читать в непрерывном процессе - PullRequest
0 голосов
/ 17 апреля 2019

Я запускаю 3 многопроцессорных цикла while, каждый из которых записывает в отдельные fifo, которые читаются непрерывно работающим процессом ffmpeg. Это выполняется для первого цикла каждого процесса, а затем останавливается.

Код ниже представляет собой один из циклов записи (два других практически одинаковы) и процесс чтения.

def dubv():
    while True:
      print('loop')
      file, dur = getFile('vocal')
      fx = (
          AudioEffectsChain()
          .delay()
      )
      songvfx = fx(file)
      with open('/tmp/pipe2.fifo', 'wb') as p1:
          print('open s fifo')
          p1.write(songvfx.T.tobytes())
          p1.close()
          print('close s fifo')
      del songvfx

def mixer():
    command4 = [
        'ffmpeg',
        '-nostdin',
        '-re',
        '-y',
        '-thread_queue_size', '4096',
        '-ac', '2',
        '-ar', '44100',
        '-f', 'f32le',
        '-i', '/tmp/pipe1.fifo',
        '-thread_queue_size', '4096',
        '-ac', '2',
        '-ar', '44100',
        '-f', 'f32le',
        '-i', '/tmp/pipe2.fifo',
        '-thread_queue_size', '4096',
        '-ac', '2',
        '-ar', '44100',
        '-f', 'f32le',
        '-i', '/tmp/pipe3.fifo',
        '-filter_complex', '[0][1][2]amix=inputs=3:dropout_transition=3[map]',
        '-map', '[map]',
        '-c:a', 'libmp3lame',
        '-b:a', '320k',
        '-f', 'mp3',
        'icecast://source:hackme@localhost:8000/test'
    ]
    o = open('/tmp/pipe1.fifo', 'rb')
    o2 = open('/tmp/pipe2.fifo', 'rb')
    o3 = open('/tmp/pipe3.fifo', 'rb')
    mix = sp.Popen(command4, stdin=DEVNULL, bufsize=4096)
    mix.wait()

Я бы хотел, чтобы процесс записи записывал в fifo2, затем зацикливался и продолжал записывать в fifo2, чтобы он непрерывно читался в процессе микшера.

EDIT:

Я думаю, что проблема возникает из-за того, что читатель закрывается, поскольку цикл запускается один раз, затем проходит по циклу, открывает fifo, но никогда не печатает 'close s fifo' снова, поэтому я предполагаю, что он не может записать в файл?

РЕДАКТИРОВАТЬ 2:

Я решил это, переместив fifo близко от петли. Мой писатель сейчас

def dubv():
  with open('/tmp/pipe2.fifo', 'wb') as p2:
    while True:
      print('loop')
      file, dur = getFile('vocal')
      fx = (
          AudioEffectsChain()
          .delay()
      )
      songvfx = fx(file)
      p2.write(songvfx.T.tobytes())
      del songvfx
      time.sleep(2)
  p2.close()
  print('close s fifo')

и программа чтения не открывает файлы fifo, поскольку ffmpeg, похоже, с этим справляется.

def mixer():
  command4 = [
      'ffmpeg',
      '-re',
      '-y',
      '-thread_queue_size', '4096',
      '-ac', '2',
      '-ar', '44100',
      '-f', 'f32le',
      '-i', '/tmp/pipe1.fifo',
      '-thread_queue_size', '4096',
      '-ac', '2',
      '-ar', '44100',
      '-f', 'f32le',
      '-i', '/tmp/pipe2.fifo',
      '-thread_queue_size', '4096',
      '-ac', '2',
      '-ar', '44100',
      '-f', 'f32le',
      '-i', '/tmp/pipe3.fifo',
      '-filter_complex', '[0][1][2]amix=inputs=3:dropout_transition=3[map]',
      '-map', '[map]',
      '-c:a', 'libmp3lame',
      '-b:a', '320k',
      '-f', 'mp3',
      'icecast://source:hackme@localhost:8000/test'
  ]
  mix = sp.Popen(command4, stdin=DEVNULL, bufsize=4096)
  mix.wait()

Если кто-нибудь увидит «лучшее» решение, пожалуйста, прокомментируйте.

Спасибо

...