Capture FFMPEG output

14,578

Solution 1

The problem is you catch only stdout and not stderr (see Standard Streams). Change this line:

$command = "/usr/bin/ffmpeg -i " . $src;

into

$command = "/usr/bin/ffmpeg -i " . $src . " 2>&1";

and give it another try :)

Solution 2

Use ffprobe instead, it's much quicker and supports JSON output.

$output = shell_exec('ffprobe -v quiet -print_format json -show_format -show_streams "path/to/yourfile.ext"');
$parsed = json_decode($output, true);

And you have all your video info in a php array! This is much faster than ffmpeg -i for some reason.

Solution 3

To get output status and output:

exec("ffmpeg -i input.avi output.mp4 2>&1", $output, $returnStatus);

print_r($output);

if($returnStatus === 0){
   // success
}
else {
   //fail
}
Share:
14,578
Andrew Ensley
Author by

Andrew Ensley

With continuous experience beginning in 2004, I am a seasoned software developer, system administrator, database administrator, DevOps engineer, and team leader. My favorite areas of focus in development are performance, optimization, and security. I have experience with: Git, Java, C#, Python, TypeScript, Node.js, React.js, SQL, PHP, Linux, Windows, MacOS, Infrastructure-as-Code, Configuration-as-Code Azure, ADO, Jenkins, GitHub, Nexus RM/IQ, JFrog Artifactory, SonarQube, Docker, Kubernetes, Cloud Foundry, TAS, TKGi, DigitalOcean, Ansible, AWS Visual Studio Code, IntelliJ IDEA, Eclipse, PyCharm, Android Studio I love automation and open-source software.

Updated on June 04, 2022

Comments

  • Andrew Ensley
    Andrew Ensley almost 2 years

    I need to read the output from ffmpeg in order to even try the solution to my question from yesterday. This is a separate issue from my problem there, so I made a new question.

    How the heck do I get the output from an ffmpeg -i command in PHP?

    This is what I've been trying:

    <?PHP
        error_reporting(E_ALL);
        $src = "/var/videos/video1.wmv";
        $command = "/usr/bin/ffmpeg -i " . $src;
        echo "<B>",$command,"</B><br/>";
        $command = escapeshellcmd($command);
    
        echo "backtick:<br/><pre>";
        `$command`;
    
        echo "</pre><br/>system:<br/><pre>";
        echo system($command);
    
        echo "</pre><br/>shell_exec:<br/><pre>";
        echo shell_exec($command);
    
        echo "</pre><br/>passthru:<br/><pre>";
        passthru($command);
    
        echo "</pre><br/>exec:<br/><pre>";
        $output = array();
        exec($command,$output,$status);
        foreach($output AS $o)
        {
                echo $o , "<br/>";
        }
        echo "</pre><br/>popen:<br/><pre>";
        $handle = popen($command,'r');
        echo fread($handle,1048576);
        pclose($handle);
        echo "</pre><br/>";
    ?>
    

    This is my output:

    <B>/usr/bin/ffmpeg -i /var/videos/video1.wmv</B><br/>
    backtick:<br/>
        <pre></pre><br/>
    system:<br/>
        <pre></pre><br/>
    shell_exec:<br/>
        <pre></pre><br/>
    passthru:<br/>
        <pre></pre><br/>
    exec:<br/>
        <pre></pre><br/>
    popen:<br/>
        <pre></pre><br/>
    

    I don't get it. safe_mode is off. There's nothing in disable_functions. The directory is owned by www-data (the apache user on my Ubuntu system). I get a valid status back from exec() and system() and running the same command from the command line give me tons of output. I feel like I must be missing something obvious but I have no idea what it is.

  • Andrew Ensley
    Andrew Ensley almost 15 years
    Ahhh... yeah. That makes sense because my return status is 1 (not 0). I wish that worked, but I still get the same result, just with: "<B>/usr/bin/ffmpeg -i /var/videos/video1.wmv 2>&1</B>" at the beginning. I'll do some research to see if Ubuntu has some differences for redirecting stderr.
  • Werner
    Werner almost 15 years
    I can confirm that the following should work. I've used this exact line in a hobby project once. exec('ffmpeg -i ' . escapeshellarg($filepath) . ' 2>&1', $output);
  • Andrew Ensley
    Andrew Ensley almost 15 years
    Ahha! I figured it out. My problem was the escapeshellcmd() function. It was changing "2>&1" to "2\>\&1". I tried your code and it worked. Lesson I've learned: output the command after you've made all modifications to it =p. Thanks.
  • Andrew Ensley
    Andrew Ensley over 11 years
    Wow, what a useful function! I had no idea this existed. Thank you!
  • tweak2
    tweak2 over 11 years
    It is also much quicker than initializing ffmpeg every time!
  • Farzad
    Farzad almost 7 years
    niiiiiiiiiiiiceeeeeeeeeeeee