string exec (…)
Here’s the tricky part. As we know from the exec() man page this function executes the given command. As described there, the exact declaration of this method is:
string exec ( string $command [, array &$output [, int &$return_var ]] ) |
So far so good. Normally exec() will return the output of the command.
FFmpeg version SVN-r21880, Copyright (c) 2000-2010 Fabrice Bellard, et al. built on Feb 18 2010 15:53:28 with gcc 4.3.2 configuration: --enable-gpl --enable-nonfree --enable-shared --enable-postproc --enable-avfilter --enable-avfilter-lavf --enable-pthreads --enable-x11grab --enable-bzlib --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-version3 --enable-libdc1394 --enable-libfaac --enable-libfaad --enable-libfaadbin --enable-libgsm --enable-libmp3lame --enable-libschroedinger --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --prefix=/usr/local libavutil 50. 9. 0 / 50. 9. 0 libavcodec 52.54. 0 / 52.54. 0 libavformat 52.52. 0 / 52.52. 0 libavdevice 52. 2. 0 / 52. 2. 0 libavfilter 1.17. 0 / 1.17. 0 libswscale 0.10. 0 / 0.10. 0 libpostproc 51. 2. 0 / 51. 2. 0 ... |
However sometimes that is not so true. Let’s see an example with the popular FFMPEG program. In one hand when you try to start a video converting program with PHP you can simply call exec with the FFMPEG command as the first parameter. The output is OK and you can dump it as in the example here.
echo exec('/usr/local/bin/ffmpeg -i input.mp4 -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -vpre normal -threads 0 output.mp4', $output); var_dump($output); |
In some cases you can call FFMPEG only with the -i option to get some info about the input file. Such info can be the size of the image, the bitrate of the source file or the length of the movie. Executing this command:
echo exec('/usr/local/bin/ffmpeg -i input.mp4', $output); var_dump($output); |
in the terminal you’ll see the output you wish. However if you trying to execute the command via exec() the output remains empty?
Why the Output Parameter is Empty?
Looking at the terminal screen you can’t see the difference, but actually in the second case, when you execute FFMPEG only with the -i option, the output is redirected to the standard error output. That’s why you can’t see it in the exec() second parameter. However there is a solution.
Solution and Conclusion
The solution is quite simple. You’ve to redirect the output of the FFMPEG command to the standard output.
/usr/local/bin/ffmpeg -i /var/www/android/test.mp4 2>&1 |
Now you can call this line with exec().
echo exec('/usr/local/bin/ffmpeg -i input.mp4 2>&1', $output); var_dump($output); |
This showcase with the FFMPEG is important not only because now you can call FFMPEG’s command without problems, but because you now know that exec() can’t read the standard error output. Thus you’ve to be careful and always redirect to the standard output.
I have a problem like you have said in use of the exec() method with a parameter of the ffmpeg command.
But I did not understand what you mean with the
“The solution is quite simple. You’ve to redirect the output of the FFMPEG command to the standard output.
/usr/local/bin/ffmpeg -i /var/www/android/test.mp4 2>&1”
What the “2>&1” means?
Thanks 😉
Hey Stoimen,
that little “2>&1” helped me out.. Thanks!
Yes, the 2>&1 at the end helped me get the output too, the command looks like this now:
Thank you.
What is $output? A file path?
@John Anderson – $output is a string containing the command’s output, i.e. what you normally see in the terminal.
This saved me a lot of time, thanks!
I’m sorry, I have the same problem even if more severe. my code worked, then I do not know why they have stopped doing it overnight. the code is:
exec(“ffmpeg -i video/howtodo.flv 2>&1”,$duration,$return);
var_dump($return);
var_dump($duration);
and the result on the screen is:
int 1
array
empty
what is the problem in your opinion??? thanks in advance
Thanks for this! Works perfectly for me
Yes, very helpful.
I would also like to know what the “2>&1” means / does? Will it also work for other commands?
Cool. Your site are helping a lot of programmer of world.
Thanks.