Run a Ffmpeg Process in the Background

Run a ffmpeg process in the background

Am I suppose to create a separate .php
file which then runs from the php cli
to execute one of these functions?

This is probably the way I would do it :

  • the PHP webpage adds a record in database to indicate "this file has to be processed"

    • and displays a message to the user ; something like "your file will be processed soon"
  • In CLI, have a batch process the new inserted files

    • first, mark a record as "processing"
    • do the ffmpeg thing
    • mark the file as "processed"
  • And, on the webpage, you can show to the user in which state his file is :

    • if it has not been processed yet
    • if it's being processed
    • or if it's been processed -- you can then give him the link to the new video file.

Here's a couple of other thoughts :

  • The day your application becomes bigger, you can have :

    • one "web server"
    • many "processing servers" ; in your application, it's the ffmpeg thing that will require lots of CPU, not serving web pages ; so, being able to scale that part is nice (that's another to "lock" files, indicating them as "processing" in DB : that way, you will not have several processing servers trying to process the same file)
  • You only use PHP from the web server to generate web pages, which is je job of a web server

    • Heavy / long processing is not the job of a web server !
    • The day you'll want to switch to something else than PHP for the "processing" part, it'll be easier.

Your "processing script" would have to be launch every couple of minutes ; you can use cron for that, if you are on a Linux-like machine.


Edit : a bit more informations, after seeing the comment

As the processing part is done from CLI, and not from Apache, you don't need anykind of "background" manipulations : you can just use shell_exec, which will return the whole ouput of the command to your PHP script when it's finished doing it's job.

For the user watching the web page saying "processing", it will seem like background processing ; and, in a way, it'll be, as the processing will be done by another processus (maybe even on another machine).

But, for you, it'll be much simpler :

  • one webpage (nothing "background")
  • one CLI script, with no background stuff either.

Your processing script could look like something like this, I suppose :

// Fetch informations from DB about one file to process
// and mark it as "processing"

// Those would be fetched / determined from the data you just fetched from DB
$in_file = 'in-file.avi';
$out_file = 'out-file.avi';

// Launch the ffmpeg processing command (will probably require more options ^^ )
// The PHP script will wait until it's finished :
// No background work
// No need for any kind of polling
$output = shell_exec('ffmpeg ' . escapeshellarg($in_file) . ' ' . escapeshellarg($out_file));

// File has been processed
// Store the "output name" to DB
// Mark the record in DB as "processed"

Really easier than what you first thought, isn't it ? ;-)

Just don't worry about the background stuff anymore : only thing important is that the processing script is launched regularly, from crontab.


Hope this helps :-)

Elixir long running background task doesn't complete, sometimes crashes

Thanks for the help from mudasobwa and Dogbert to answer this question. I followed this guide to get an independent supervisor up and running in my phoenix stack like they suggested. The gist of this is to add a line to lib/myapp.ex that creates a Supervisor like such

supervisor(Task.Supervisor, [[name: MyApp.TaskSupervisor]])

Then when you want to run a task with that supervisor as the parent, you can run

Task.Supervisor.start_child(MyApp.TaskSupervisor, fn -> do_stuff() end)

In my case, do_stuff involved spawning an ffmpeg process and doing some file cleanup. The basic idea here is that you are doing this work with the Supervisor as parent so that even when the request exits and that process dies, your supervisor is still alive and well since it is always up when your application is up.

Need to run task in android background services?

None of those is the right answer. IntentService isn't a solution, as background services get killed in 2 minutes. JobScheduler would have the same problem- processing time limitations. As would Workmanager.

What you want is a foreground service. Foreground services are services that can run for long times (they will still also be eventually killed, but can run for hours). Foreground services are launched by using startForegroundService instead of startService, and require the Service to call startForeground and provide a notification that will be in the status bar as long as the service is running.



Related Topics



Leave a reply



Submit