Best way to launch FFMpeg process within a python webservice

I am building a local proxy tool for HLS playback. And I am having trouble finding a way to efficiently run an ffmpeg pipeline within the python webservice. Which is to run a websocket and serve static files.

I am hoping my choices of software are ok as it needs to be as light as possible. I am using asyncio based functions within starlette and launched by uvicorn on Windows.

I have launched the process via a task. But Ffmpeg seems to be constantly being stalled so not writing HLS fragments to disk fast enough. On the command line its fine.

In my program I can first doing a UDP check once data is received start the process within a task.

def datagram_received(self, data, addr):
        if (self.check_task is not None):
            self.check_task.cancel();

        self.transport.close()

        logging.info("Got UDP Data starting FFMPEG")

        asyncio.create_task(send_info_to_client(self.websocket))
        asyncio.create_task(startFFMpegProcess(self.launcher))
    ```

Then something like this. Do I need to use Popen and launch in a Daemon thread instead ? Or can this method be launched in a thread ? asyncio.create_subprocess_exec. It seems to stall while serving files but not even when serving files and using an external server. 

    async def launch(self):
    self.proc = await asyncio.create_subprocess_exec(
    'ffmpeg/bin/ffmpeg',
    ...
    , stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
    )

    logging.info("Run FFmpeg")
    print(f'Process pid is: {self.proc.pid}')
    stdout_task = asyncio.create_task(write_output('ffmpeg: ', self.proc.stdout, self.proc.stderr))
    return_code, _ = await asyncio.gather(self.proc.wait(), stdout_task)
    print(f'Process returned: {return_code}')

Read more here: Source link