ffmpeg: using the returned data in php
Вопрос
I have started using ffmpeg
and I am very new to it, so please bear with me.
I have installed ffmpeg
on my server and it works great; I can run certain commands and get output data when logged in via ssh
For example I can run
ffmpeg -i Sleep\ Away.mp3
Which returns the following:
ffmpeg version 0.8.5, Copyright (c) 2000-2011 the FFmpeg developers
built on Aug 20 2012 09:28:43 with clang 3.1 (tags/Apple/clang-318.0.61)
configuration: --enable-nonfree --enable-gpl --enable-version3 --enable-postproc --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libfaac --enable-libxvid --enable-libx264 --enable-libvpx --enable-hardcoded-tables --enable-shared --enable-pthreads --disable-indevs --cc=clang
libavutil 51. 9. 1 / 51. 9. 1
libavcodec 53. 7. 0 / 53. 7. 0
libavformat 53. 4. 0 / 53. 4. 0
libavdevice 53. 1. 1 / 53. 1. 1
libavfilter 2. 23. 0 / 2. 23. 0
libswscale 2. 0. 0 / 2. 0. 0
libpostproc 51. 2. 0 / 51. 2. 0
[mp3 @ 0x7f9694011a00] Header missing
Last message repeated 13 times
[mp3 @ 0x7f9694007c00] max_analyze_duration 5000000 reached at 5007020
[mp3 @ 0x7f9694007c00] Estimating duration from bitrate, this may be inaccurate
Input #0, mp3, from 'Sleep Away.mp3':
Metadata:
track : 3
album : Bob Acri
artist : Bob Acri
title : Sleep Away
genre : Jazz
album_artist : Bob Acri
composer : Robert R. Acri
date : 2004
Duration: 00:03:21.77, start: 0.000000, bitrate: 192 kb/s
Stream #0.0: Audio: mp3, 44100 Hz, stereo, s16, 192 kb/s
At least one output file must be specified
The question I am asking is, how can I use the output data above? I am developiong a music website; say I want to loop through all the MP3 files and save the info about them into a database, so that the above would result in:
Sleep Away.mp3 mp3 3:21 Jazz 2004 Bob Acri ...
obviously in a table
I have tried to use the php backtick operator with no success so far. I just thought I would put a question up here to get some advice from people that have done something similar.
Thanks
Update: I have tried the following
<?php $output = `ffmpeg -i Sleep\ Away.mp3`; echo "<pre>$output</pre>"; ?>
<?php $output = shell_exec('ffmpeg -i Sleep\ Away.mp3'); echo "<pre>$output</pre>"; ?>
both don't appear to return anything.
Решение
ffmpeg
sends that information on standard error, and not to standard output which is what shell_exec()
captures.
You need to add: 2>&1
at the end of your command:
$out = shell_exec('/path/to/ffmpeg -i Sleep\ Away.mp3 2>&1');
Другие советы
So you want to execute a shell command (ffmpeg in your case) from php, and capture its output, right?
Backtick Operator or the shell_exec function are a good start for that.
Note that these only work when safe mode is disabled and when shell_exec function is not disabled (via disable_functions setting). If your scripts are running on a shared hoster, you might not have access to these configurations, but you should at least be able to check them via phpinfo().
How you specify the path to any file you are referencing in the command is also crucial - your php script might not run with the working folder you expect it to run; so it might be best to reference to all files via absolute path.
Use FFprobe instead:
ffprobe -loglevel error -show_format -show_streams input.mp3
FFmpeg is for manipulating video, FFprobe is the accompanying tool for getting video information. It outputs data in a variety of easily parsed formats instead of requiring parsing the diagnostic messages that FFmpeg incidentally spits out when importing a video.