2015-08-06 6 views
6

में कनवर्ट करने के लिए मेरे पास एक वीडियो होस्टिंग साइट है और मेरे स्थानीय सर्वर पर सफलतापूर्वक ffmpeg स्थापित किया है। चीजें समग्र रूप से काम करती हैं, लेकिन मुझे वीडियो अवधि नहीं मिल सकती है और यह नहीं पता कि वीडियो को ogg प्रारूप में कैसे परिवर्तित करें। मैं वीडियो को mp4 पर परिवर्तित कर सकता हूं लेकिन यह सुनिश्चित नहीं है कि एक ही कोड ogg पर भी परिवर्तित हो सकता है।ffmpeg और php वीडियो से छवि प्राप्त करने और वीडियो को ogg

एक और बात यह है कि मैं वीडियो की शुरुआत में वीडियो से थंबनेल प्राप्त कर सकता हूं लेकिन मुझे 50 सेकंड के बाद यह चाहिए।

$base = basename($uploadfile, $safe_file['ext']); 
       $new_file = $base.'mp4'; 
       $new_image = $base.'jpg'; 
       $new_image_path = $live_img.$new_image; 
       $new_flv = $live_dir.$new_file; 

    equire 'vendor/autoload.php'; 
     //ececute ffmpeg generate mp4 
     exec('ffmpeg -i '.$uploadfile.' -f mp4 -s 896x504 '.$new_flv.''); 
     //execute ffmpeg and create thumb 
     exec('ffmpeg -i '.$uploadfile.' -f mjpeg -vframes 71 -s 768x432 -an '.$new_image_path.''); 
+0

तुम क्यों Theora OGG में चाहते हैं की जानकारी? यदि आप उस दिशा में जाने जा रहे हैं तो वेबएम में वीपी 8 (या वीपी 9) का उपयोग क्यों न करें?यह एक और आधुनिक वीडियो प्रारूप है, और (मैं यहां अनुमान लगा रहा हूं) थियोरा + ओजीजी का समर्थन करने वाले ब्राउज़र को वीपी 8 + वेबएम का समर्थन करना चाहिए। – LordNeckbeard

उत्तर

6

जब से तुम वास्तव में तीन एक सवाल में जाने मुझे कदम से इस कदम के माध्यम से जाना है, लेकिन संस्करण और ffmpeg निर्माण मैं के साथ इस परीक्षण किया है की सक्षम सुविधाएं कुछ सभी जानकारी के पहले।

ffmpeg version 2.6.2 Copyright (c) 2000-2015 the FFmpeg developers 
    built with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) 
    configuration: --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-avresample --disable-debug --enable-nonfree --enable-gpl --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-decoder=amrnb --disable-decoder=amrwb --enable-libpulse --enable-libx264 --enable-libx265 --enable-libfdk-aac --enable-libvorbis --enable-libmp3lame --enable-libopus --enable-libvpx --enable-libspeex --enable-libass --enable-avisynth --enable-libsoxr --enable-libxvid --enable-libvo-aacenc --enable-libvidstab 
    libavutil  54. 20.100/54. 20.100 
    libavcodec  56. 26.100/56. 26.100 
    libavformat 56. 25.101/56. 25.101 
    libavdevice 56. 4.100/56. 4.100 
    libavfilter  5. 11.102/5. 11.102 
    libavresample 2. 1. 0/2. 1. 0 
    libswscale  3. 1.101/3. 1.101 
    libswresample 1. 1.100/1. 1.100 
    libpostproc 53. 3.100/53. 3.100 
Hyper fast Audio and Video encoder 

अवधि


जब से तुम ffmpeg स्थापित आप शायद ffprobe भी है।

ffprobe

ffprobe मल्टीमीडिया धाराओं और मानव और मशीन पठनीय फैशन में प्रिंट से जानकारी इकट्ठा ...

तो का उपयोग कर ffprobe तुम कर सकते हो अवधि पाने के लिए निम्नलिखित:

exec('ffprobe -i input-file.mp4 -show_format | grep duration 2>&1', $result); 
echo "<pre>"; 
var_dump($result[0]); // string(19) "duration=104.022000" 
echo "</pre>"; 

- Upd खा लिया -

LordNeckbeard तो बाहर बिंदु करने के लिए यहाँ grep उपयोगिता का उपयोग करने के लिए कोई जरूरत नहीं है उस तरह का था। और चूंकि यह एक यूनिक्स आधारित उपकरण है और इसलिए सभी ऑपरेटिंग सिस्टम पर मौजूद नहीं है, इसलिए उनका प्रस्ताव बिल्कुल सही है।

तो यहां grep के उपयोग के बिना एक उदाहरण है जो निम्नलिखित http://trac.ffmpeg.org/wiki/FFprobeTips पृष्ठ पर पाया जा सकता है।

exec('ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input-file.mov 2>&1', $result); 
echo "<pre>"; 
var_dump($result[0]); // string(11) "5634.401068" 
echo "</pre>"; 

थंबनेल


ffmpeg डॉक्स पृष्ठ बताते हैं कि कैसे निम्नलिखित मानकों के साथ ffmpeg बुला एक वीडियो से कई थंबनेल निकालने के लिए एक उदाहरण है:

ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg 

यह निकाला जाएगा ओ वीडियो से प्रति सेकंड फ्रेम फ्रेम और उन्हें foo-001.jpeg नामक फ़ाइलों में आउटपुट करेगा, foo-002.jpeg इत्यादि। छवियों को नए WxH मानों को फिट करने के लिए पुन: सहेजा जाएगा।

यदि आप केवल सीमित संख्या में फ्रेम निकालना चाहते हैं, तो आप उपरोक्त आदेश को -vframes या -t विकल्प के साथ संयोजन में या समय-समय पर किसी निश्चित बिंदु से निकालने के लिए संयोजन में उपयोग कर सकते हैं।

समय में एक निश्चित बिंदु आप -vframes जो -frames:v के लिए एक उपनाम है के साथ संयोजन में -ss आदेश का उपयोग करने के लिए होगा से एक थंबनेल निकालने के लिए।

exec('ffmpeg -i input.mp4 -r 1 -ss 00:00:50 -vf scale=1024:-1 -vframes 1 output.jpeg 2>&1', $result); 
echo "<pre>"; 
print_r($result); 
echo "</pre>"; 

लेकिन -ss आदेश पर निम्नलिखित जानकारी के बारे में पता होना: यहां एक उदाहरण दिया कि कैसे करना होता है।

ध्यान दें कि अधिकांश प्रारूपों में बिल्कुल खोजना संभव नहीं है, इसलिए ffmpeg स्थिति से पहले निकटतम खोज बिंदु की तलाश करेगा। जब ट्रांसकोडिंग और -accurate_seek सक्षम है (डिफ़ॉल्ट), खोज बिंदु और स्थिति के बीच यह अतिरिक्त खंड डीकोड और त्याग दिया जाएगा। जब स्ट्रीम कॉपी या कब -noaccurate_seek का उपयोग किया जाता है, तो इसे संरक्षित किया जाएगा।

यह भी सुनिश्चित करें कि आपका आउटपुट पथ लिखने योग्य है। नहीं तो आप इस तरह की तलाश में एक त्रुटि प्राप्त होगी:

[image2 @ 0x35ae280] Could not open file : /output/path/to/your/file 

Theora और Vorbis एन्कोडिंग


यह केवल एक चीज मैं क्योंकि तथ्य यह है कि ffmpeg के अपने निर्माण नहीं करता है का परीक्षण नहीं कर सकता है जैसा कि आप उपरोक्त जानकारी से बता सकते हैं

--enable-libtheora

झंडा है। आवश्यक पुस्तकालयों को थियोरा वीडियो प्रारूप और वोर्बीस ऑडियो प्रारूप में डीकोड करने में सक्षम होने के लिए आपको मूल रूप से ffmpeg संकलित करने की आवश्यकता है।

यहां कुछ जानकारी दी गई है जिससे आप इसे शुरू कर सकें।

A Brief Theora and Vorbis Encoding Guide

आप एक कस्टम उल्लेख किया पुस्तकालयों के साथ निर्माण है, तो आपको निम्न कार्य करने में सक्षम होना चाहिए:

exec('ffmpeg -i input.mkv -codec:v libtheora -qscale:v 7 -codec:a libvorbis -qscale:a 5 output.ogv 2>&1', $result); 
echo "<pre>"; 
print_r($result); 
echo "</pre>"; 

Here जहां इन जानकारी का सबसे पाया जा सकता है के लिए लिंक है।

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

+0

अच्छा जवाब है, लेकिन आप 'ffprpeg विकी: एफएफप्रोब टिप्स] (http://trac.ffmpeg.org/wiki/FFprobeTips) में अवधि उदाहरणों में दिखाए गए अनुसार' ffprobe' कमांड को संशोधित करके 'grep' प्रक्रिया को छोड़ सकते हैं। इसके अलावा, [स्केल फ़िल्टर] (https://ffmpeg.org/ffmpeg-filters.html#scale) '-s' से अधिक लचीला है, इसलिए आप इसके बजाय '-vf scale = 1024: -1' कर सकते हैं और केवल चौड़ाई या ऊंचाई की आपूर्ति करने की जरूरत है; पहलू को संरक्षित करते समय 'ffmpeg' दूसरे की गणना करेगा। – LordNeckbeard

+0

@ लॉर्डनबेकर्ड - संकेत के लिए धन्यवाद, इस बारे में अवगत नहीं था, कुछ नया, महान सीखा। उत्तर में एक अद्यतन बनाया। – DavidDomain

3

लिनक्स के लिए:

//video converting... 
shell_exec("$ffmpegPath -i source.mp4 -s 1280x720 -metadata title='Sample' -bufsize 1835k -b:v 1000k -vcodec libx264 -acodec libfdk_aac sample.mp4");//for mp4 
shell_exec("$ffmpegPath -i source.mp4 -s 1280x720 -metadata title='Sample' -bufsize 1835k -b:v 1000k -vcodec libtheora -acodec libvorbis sample.ogg");//for ogg 
shell_exec("$ffmpegPath -i source.mp4 -s 1280x720 -metadata title='Sample' -bufsize 1835k -b:v 1000k -vcodec libvpx-acodec libvorbis sample.webm");//for webm 

//Get theumbnail 
shell_exec("$ffmpegPath -i input.flv -ss 00:00:14 -vframes 1 sample.png"); 
//you can change the -ss value you want. 
//then if u want to check if you have already install ur ffmpeg just type in your terminal in linux "ffmpeg" see pic below 

enter image description here

अधिक यहाँ https://www.ffmpeg.org/documentation.html

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