Я запускаю 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()
Если кто-нибудь увидит «лучшее» решение, пожалуйста, прокомментируйте.
Спасибо