2010-09-22 18 views
5

जब मैं ब्राउज़र में रूपांतरण चलाता हूं तो यह केवल सफेद रिक्त स्थान दिखाता है। केवल रूपांतरण प्रक्रिया पृष्ठ लोड होने के बाद ही।ffmpeg वीडियो एन्कोडिंग प्रगति पट्टी

कृपया एक प्रगति पट्टी को कार्यान्वित करने का सुझाव दें जो वीडियो रूपांतरण होने पर उपयोगकर्ता को प्रगति दिखाता है।

मैं अपने php स्क्रिप्ट में इस राशि

exec("ffmpeg -i filename.flv -sameq -ab 128 -s 640x480 filename.mp4"); 

तो कैसे मैं इस स्क्रिप्ट बदलने के लिए भी एक फाइल करने के लिए या सीधे पृष्ठ में ouput के रूप में प्रगति का विवरण प्राप्त करने चाहिए। विस्तार से समझाए जाने के लिए कृपया मुझे कोई पूर्ण स्क्रिप्ट/कोड दे सकते हैं। क्योंकि मुझे लगता है कि मुझे पूरा जवाब नहीं मिल सकता है और इसलिए मैं इस

उत्तर

0

के साथ क्या करना है इस पर उलझन में हूं, मुझे विश्वास नहीं है कि यह संभव है।

समस्या यह है कि वर्तमान ffmpeg प्रोसेसिंग स्थिति से अवगत होने के लिए आपको अपनी PHP स्क्रिप्ट चाहिए। यदि आप कमांड लाइन के माध्यम से ffmpeg रूपांतरण करते हैं, तो यह उपयोगकर्ता को प्रगति प्रदर्शित करता है, लेकिन जब आप ffmpeg को exec जैसे PHP में कमांड का उपयोग करते हैं तो आपके पास उस आउटपुट स्ट्रीम तक पहुंच नहीं है।

उपयोगकर्ता को एक वास्तविक "प्रगति सूचक" दिखाने की कोशिश करने के बजाय, मेरा सुझाव है कि आप इसके बजाय पृष्ठ पर एक प्रतीक्षा संकेतक लाइटबॉक्स करें। आप इस उद्देश्य के अनुरूप कई छवियां पा सकते हैं या http://ajaxload.info/ जैसे टूल के माध्यम से एक उत्पन्न कर सकते हैं।

+0

यह अजीब और अक्षम हो जाएगा में पाया है, लेकिन मुझे लगता है कि आप एक के लिए ffmpeg उत्पादन रीडायरेक्ट करने के लिए सक्षम होना चाहिए tempfile, जिसे php द्वारा पढ़ा जा सकता है। मैं जल्द ही प्रतीक्षा सूचक के लिए जाना होगा - बहुत आसान है। –

3

यह किया जा सकता है, हालांकि यह छोटी-छोटी फ़ाइलों के लिए एक सरल ajax सूचक के लिए जाने के लिए अच्छा विचार होगा, लेकिन बड़ी फ़ाइलों के लिए> 50-80 एमबीएस आप यह कर सकते हैं:

आप FFMPEG वापसी मान पढ़ सकते हैं PHP के माध्यम से। ffmpeg (अंतिम कुछ पंक्तियां) यह लौटाती है:

Press [q] to stop encoding 
frame= 1850 fps=115 q=31.0 Lsize= 5789kB time=74.00 bitrate= 640.8kbits/s 
video:5135kB audio:580kB 

समय = 74.00 वर्तमान फ़ाइल समय (निष्पादन समय नहीं) है। आप उस मान को पार्स करने के लिए कुछ रेगेक्स का उपयोग कर सकते हैं और कुछ गणित के साथ आप प्रतिशत पूर्ण बार प्राप्त कर सकते हैं।

यदि आप फ़ाइल की समय सीमा नहीं जानते हैं। एफएफएमपीईजी पहले कुछ लाइनें यह लौटाती हैं:

Input #0, flv, from 'cf_video_3728.flv': 
    Duration: 00:01:14.13, start: 0.000000, bitrate: 864 kb/s 

आप अवधि को पार्स कर सकते हैं और कुल समय प्राप्त कर सकते हैं।

उम्मीद है कि इससे मदद मिलती है।

0

आपको COMET पढ़ने में रुचि हो सकती है।

यह एक प्रोग्रामिंग तकनीक है जो आपको ब्राउज़र से अनुरोध करने के लिए ब्राउज़र से जानकारी को धक्का दे सकती है।

यहां एक लेख है जो एक छिपी हुई आईफ्रेम के उपयोग के माध्यम से इसे PHP के साथ कार्यान्वित करने का तरीका बताता है।

http://www.zeitoun.net/articles/comet_and_php/start

शायद आप जवाब Stewie ffmpeg से लौटने के मूल्यों को पढ़ने से संबंधित प्रदान की साथ संयोजन के रूप में इसका उपयोग कर सकते हैं।

+0

मूल रूप से मैं सहमत हूं, [धूमकेतु डी] (http://cometd.org/) मेरा उत्तर पूरा कर देगा और किसी भी पुश तकनीक को प्राथमिकता दी जानी चाहिए। – sebilasse

4

जावास्क्रिप्ट को परिवर्तित करने के लिए php को [1] शुरू करना चाहिए और फिर [2] ...


[1]php: शुरू रूपांतरण और एक textfile करने के लिए स्थिति लिखने - उदाहरण वाक्य रचना:

exec("ffmpeg -i path/to/input.mov path/to/output.flv 1>path/to/output.txt 2>&1"); 

दूसरे भाग के लिए हम सिर्फ जावास्क्रिप्ट आवश्यकता को पढ़ने के लिए फ़ाइल। निम्न उदाहरण AJAX के लिए dojo.request का उपयोग करता है, लेकिन आप के रूप में अच्छी jQuery या वेनिला या जो कुछ भी इस्तेमाल कर सकते हैं:

[2]js: हड़पने फ़ाइल से प्रगति:

var _progress = function(i){ 
    i++; 
    // THIS MUST BE THE PATH OF THE .txt FILE SPECIFIED IN [1] : 
    var logfile = 'path/to/output.txt'; 

/* (example requires dojo) */ 

request.post(logfile).then(function(content){ 
// AJAX success 
    var duration = 0, time = 0, progress = 0; 
    var result = {}; 

    // get duration of source 
    var matches = (content) ? content.match(/Duration: (.*?), start:/) : []; 
    if(matches.length>0){ 
     var rawDuration = matches[1]; 
     // convert rawDuration from 00:00:00.00 to seconds. 
     var ar = rawDuration.split(":").reverse(); 
     duration = parseFloat(ar[0]); 
     if (ar[1]) duration += parseInt(ar[1]) * 60; 
     if (ar[2]) duration += parseInt(ar[2]) * 60 * 60; 

     // get the time 
     matches = content.match(/time=(.*?) bitrate/g); 
     console.log(matches); 

     if(matches.length>0){ 
      var rawTime = matches.pop(); 
      // needed if there is more than one match 
      if (lang.isArray(rawTime)){ 
       rawTime = rawTime.pop().replace('time=','').replace(' bitrate',''); 
      } else { 
       rawTime = rawTime.replace('time=','').replace(' bitrate',''); 
      } 

      // convert rawTime from 00:00:00.00 to seconds. 
      ar = rawTime.split(":").reverse(); 
      time = parseFloat(ar[0]); 
      if (ar[1]) time += parseInt(ar[1]) * 60; 
      if (ar[2]) time += parseInt(ar[2]) * 60 * 60; 

      //calculate the progress 
      progress = Math.round((time/duration) * 100); 
     } 

     result.status = 200; 
     result.duration = duration; 
     result.current = time; 
     result.progress = progress; 

     console.log(result); 

     /* UPDATE YOUR PROGRESSBAR HERE with above values ... */ 

     if(progress==0 && i>20){ 
      // TODO err - giving up after 8 sec. no progress - handle progress errors here 
      console.log('{"status":-400, "error":"there is no progress while we tried to encode the video" }'); 
      return; 
     } else if(progress<100){ 
      setTimeout(function(){ _progress(i); }, 400); 
     } 
    } else if(content.indexOf('Permission denied') > -1) { 
     // TODO - err - ffmpeg is not executable ... 
     console.log('{"status":-400, "error":"ffmpeg : Permission denied, either for ffmpeg or upload location ..." }');  
    } 
}, 
function(err){ 
// AJAX error 
    if(i<20){ 
     // retry 
     setTimeout(function(){ _progress(0); }, 400); 
    } else { 
     console.log('{"status":-400, "error":"there is no progress while we tried to encode the video" }'); 
     console.log(err); 
    } 
    return; 
}); 

} 
setTimeout(function(){ _progress(0); }, 800); 
1

यदि आप PHP-FFMpeg का उपयोग कर रहे हैं, तो उन्होंने एक फ़ंक्शन जोड़ा है जिसे आप प्रगति के लिए सुन सकते हैं और कॉल को वापस निष्पादित कर सकते हैं। आप यह बहुत की तरह सेट अप अपने वीडियो प्रारूप कंटेनर पर:

$format = new Format\Video\X264(); 
$format->on('progress', function ($video, $format, $percentage) { 
    echo "$percentage % transcoded"; 
}); 

अधिक जानकारी डॉक्स https://github.com/PHP-FFMpeg/PHP-FFMpeg

संबंधित मुद्दे