如何在while循环中写入fifo和在连续过程中读取

时间:2019-04-17 13:55:31

标签: python while-loop ffmpeg fifo

我正在运行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,以便在混合器过程中连续读取。

编辑:

我认为问题出在读者关闭,因为循环运行了一次,然后在循环中运行,打开了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')

并且ffmpeg似乎可以解决这个问题,因此读者没有打开fifo文件。

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()

如果有人看到“更好”的解决方案,请发表评论。

谢谢

0 个答案:

没有答案