2009-07-10 38 views
8

Tôi cần đọc kết quả đầu ra từ ffmpeg để thậm chí thử giải pháp my question from yesterday. Đây là một vấn đề riêng biệt từ vấn đề của tôi ở đó, vì vậy tôi đã thực hiện một câu hỏi mới.Ghi lại đầu ra FFMPEG

Làm cách nào để tôi nhận được kết quả từ lệnh ffmpeg -i trong PHP?

Đây là những gì tôi đã cố gắng:

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

Đây là kết quả của tôi:

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

Tôi không nhận được nó. safe_mode bị tắt. Không có gì trong số disable_functions. Thư mục là được sở hữu bởi www-data (người dùng apache trên hệ thống Ubuntu của tôi). Tôi nhận được một trạng thái hợp lệ trở lại từ exec()system() và chạy cùng một lệnh từ dòng lệnh cho tôi tấn đầu ra. Tôi cảm thấy như tôi phải thiếu một cái gì đó hiển nhiên nhưng tôi không biết nó là gì.

Trả lời

24

Vấn đề là bạn chỉ bắt được stdout chứ không phải stderr (xem Standard Streams). Thay đổi dòng này:

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

vào

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

và cung cấp cho nó một thử :)

+0

Ahhh ... yeah. Điều đó có ý nghĩa vì trạng thái trả về của tôi là 1 (không phải 0). Tôi muốn điều đó có hiệu quả, nhưng tôi vẫn nhận được kết quả tương tự, chỉ với: "/usr/bin/ffmpeg -i /var/videos/video1.wmv 2> & 1" khi bắt đầu. Tôi sẽ làm một số nghiên cứu để xem Ubuntu có một số khác biệt cho việc chuyển hướng stderr hay không. –

+0

Tôi có thể xác nhận rằng những điều sau đây sẽ hoạt động. Tôi đã sử dụng dòng chính xác này trong một dự án sở thích một lần. exec ('ffmpeg -i'. Escapeshellarg ($ filepath). '2> & 1', $ output); – Werner

+0

Ahha! Tôi đã hiểu rồi. Vấn đề của tôi là hàm escapeshellcmd(). Nó đã thay đổi "2> & 1" thành "2 \> \ & 1". Tôi đã thử mã của bạn và nó hoạt động. Bài học tôi đã học: xuất lệnh * sau * bạn đã thực hiện tất cả các sửa đổi cho nó = p. Cảm ơn. –

6

Sử dụng ffprobe thay vào đó, nó nhanh hơn và hỗ trợ đầu ra JSON.

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

Và bạn có tất cả thông tin video của mình trong một mảng php! Điều này là nhanh hơn nhiều so với ffmpeg -i vì lý do nào đó.

+1

Wow, những gì một chức năng hữu ích! Tôi không có ý tưởng này tồn tại. Cảm ơn bạn! –

+1

Nó cũng nhanh hơn nhiều so với việc khởi tạo ffmpeg mỗi lần! – tweak2

0

Bạn có thể sử dụng exec và print_r đầu ra ...

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

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

Để có được tình trạng đầu ra và đầu ra:

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

print_r($output); 

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

niiiiiiiiiiiiceeeeeeeeeeeee – grizzly

Các vấn đề liên quan