我正在运行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()
如果有人看到“更好”的解决方案,请发表评论。
谢谢