2009-07-10 6 views
8

मुझे my question from yesterday के समाधान का प्रयास करने के लिए ffmpeg से आउटपुट पढ़ने की आवश्यकता है। यह मेरी समस्या से एक अलग मुद्दा है, इसलिए मैंने एक नया प्रश्न बना दिया।कैप्चर एफएफएमपीईजी आउटपुट

PHP में मुझे ffmpeg -i कमांड से आउटपुट कैसे प्राप्त होता है?

<?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/>"; 
?> 

यह मेरी उत्पादन होता है:

<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/> 

मैं इसे नहीं मिलता

यह मैं क्या कोशिश कर ली जाती है। safe_mode बंद है। disable_functions में कुछ भी नहीं है। निर्देशिका स्वामित्वwww-data (मेरे उबंटू सिस्टम पर अपाचे उपयोगकर्ता) है। मुझे exec() और system() से एक वैध स्थिति वापस मिलती है और कमांड लाइन से एक ही कमांड चलाने से मुझे आउटपुट मिल जाता है। मुझे लगता है कि मुझे कुछ स्पष्ट याद आना चाहिए, लेकिन मुझे नहीं पता कि यह क्या है।

उत्तर

24

समस्या तुम्हें पकड़ केवल stdout और नहीं stderr (Standard Streams देखें)। इस लाइन बदलें:

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

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

और यह एक और कोशिश :)

+0

आह ... हाँ। यह समझ में आता है क्योंकि मेरी वापसी की स्थिति 1 (0 नहीं) है। मेरी इच्छा है कि काम किया, लेकिन मुझे अभी भी वही परिणाम मिल गया है, बस: "/usr/bin/ffmpeg -i /var/videos/video1.wmv 2> और 1" शुरुआत में। मैं यह देखने के लिए कुछ शोध करूंगा कि क्या उबंटू में stderr को पुनर्निर्देशित करने के लिए कुछ अंतर हैं। –

+0

मैं पुष्टि कर सकता हूं कि निम्नलिखित कार्य करना चाहिए। मैंने एक बार एक शौक परियोजना में इस सटीक रेखा का उपयोग किया है। exec ('ffmpeg -i'। Escapeshellarg ($ filepath)। '2> और 1', $ आउटपुट); – Werner

+0

अहहा! मैं यह समझ गया। मेरी समस्या escapeshellcmd() फ़ंक्शन था। यह "2> और 1" से "2 \> \ & 1" बदल रहा था। मैंने आपके कोड की कोशिश की और यह काम किया। सबक मैंने सीखा है: कमांड * आउटपुट * के बाद * आपने इसमें सभी संशोधन किए हैं = पी। धन्यवाद। –

6

उपयोग ffprobe इसके बजाय, यह बहुत जल्दी है और JSON उत्पादन का समर्थन करता है प्रदान करते हैं।

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

और आपके पास अपनी सभी वीडियो जानकारी एक php सरणी में है! यह किसी कारण से ffmpeg -i से बहुत तेज है।

+1

वाह, क्या एक उपयोगी काम है! मुझे नहीं पता था कि यह अस्तित्व में था। धन्यवाद! –

+1

यह हर बार ffmpeg शुरू करने से भी तेज़ है! – tweak2

0

आप कार्यकारी का उपयोग करें और उत्पादन कर सकते हैं ... print_r

exec("ffmpeg -i input.avi -vcodec h264 -acodec aac -strict -2 output.mp4 2>&1",$output); 

echo "<pre>"; 
print_r($output); 
echo "</pre>"; 
2

उत्पादन की स्थिति और उत्पादन प्राप्त करने के लिए:

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

print_r($output); 

if($returnStatus === 0){ 
    // success 
} 
else { 
    //fail 
} 
+0

niiiiiiiiiiiiceeeeeeeeeeeeeeeee – grizzly