2008-09-20 15 views
6

ठीक है, मुझे वीडियो प्रारूप की मूल बातें मिलती हैं - कुछ कंटेनर प्रारूप हैं और फिर आपके पास मूल वीडियो/ऑडियो प्रारूप हैं। मैं एक वेब आधारित एप्लिकेशन लिखना चाहता हूं जो यह निर्धारित करता है कि फ़ाइल किस वीडियो/ऑडियो कोडेक का उपयोग कर रही है।प्रोग्रामेटिक रूप से वीडियो फ़ाइल प्रारूप निर्धारित करते हैं?

मैं प्रोग्राम कोडेटिक रूप से वीडियो कोडेक कैसे निर्धारित कर सकता हूं? क्या सिस्टम कॉल के माध्यम से मानक लाइब्रेरी का उपयोग करना और इसके आउटपुट को पार्स करना सबसे अच्छा होगा? (उदाहरण के लिए ffmpeg, ट्रांसकोड, आदि?)

उत्तर

7

mplayer -identify चाल करेगा। फ़ाइल पर बस ffmpeg पर कॉल करना भी काम करेगा - यह वास्तव में इनपुट फ़ाइल के बारे में जानकारी के एक सेट को स्वचालित रूप से प्रिंट करेगा जो आप वास्तव में करने के लिए ffmpeg कह रहे हैं।

बेशक, यदि आप इसे अपने प्रोग्राम से बाहरी कार्यक्रम में निष्पादित कॉल के बिना करना चाहते हैं, तो आप केवल एवोकोड पुस्तकालयों को शामिल कर सकते हैं और अपनी पहचान नियमित रूप से सीधे चला सकते हैं।

जबकि आप अपना खुद का पता लगा सकते हैं, यह निश्चित रूप से मौजूदा दिनचर्या से कम होगा जो libav * समर्थनों की बिल्कुल बड़ी संख्या में प्रारूपों को देखते हैं। और यह पहिया को पुनर्निर्मित करने का एक मूर्खतापूर्ण मामला होगा।

लिनक्स की "फ़ाइल" कमांड भी चाल कर सकती है, लेकिन डेटा प्रिंट करने की मात्रा वीडियो प्रारूप पर निर्भर करती है। उदाहरण के लिए, एवीआई पर यह रिज़ॉल्यूशन, चार सीसीसी, एफपीएस इत्यादि के बारे में सभी प्रकार के डेटा देता है, जबकि एमकेवी फ़ाइल के लिए यह केवल "मैट्रोस्का डेटा" कहता है, जो आपको आंतरिक, या यहां तक ​​कि वीडियो और ऑडियो प्रारूपों के बारे में कुछ नहीं बताता है।

1

आपको लाइन को और नीचे शुरू करने की आवश्यकता है। आपको कंटेनर प्रारूप और यह कोडेक निर्दिष्ट करने की आवश्यकता है।

तो मैं एक ऐसे प्रोग्राम से शुरू करूंगा जो कंटेनर प्रारूप की पहचान करे (न केवल एक्सटेंशन से, शीर्षलेख में जाएं और वास्तविक कंटेनर निर्धारित करें)।

फिर पता लगाएं कि कौन सा कंटेनर आपका प्रोग्राम समर्थन करेगा, और कंटेनर में संग्रहीत मेटा डेटा को पार्स करने के लिए आवश्यक कार्यों में डाल देगा, जिसमें कोडेक्स शामिल होंगे।

-Adam

1

आप वास्तव में द्विआधारी की पहचान मार्कर का एक बड़ा डेटाबेस फ़ाइल के शुरू के निकट देखने के लिए चाहते हैं। सौभाग्य से, आपका प्रश्न "लिनक्स" टैग किया गया है, और इस तरह का एक डबेज पहले से मौजूद है; फ़ाइल (1) आपके लिए नौकरी करेगी।

+0

यह काफी दूर नहीं जाता है। फ़ाइल आपको थोड़ा बताती है, लेकिन ओपी जैसे कोडेक्स नहीं पूछता है। –

4

मैंने इसे प्राप्त करने के लिए एक पर्ल स्क्रिप्ट में FFMPEG का उपयोग किया है।

$info = `ffmpeg -i $path$file 2>&1 /dev/null`; 
@fields = split(/\n/, $info); 

और केवल यह पता लगाएं कि @ फ़ील्ड में आपको कौन से आइटम निकालने की आवश्यकता है।

0

मैं ffprobe का उपयोग करने और जेसन को आउटपुट प्रारूप को बल देने की सलाह दूंगा। पार्स करना इतना आसान होगा। सबसे सरल उदाहरण:

$meta = json_decode(join(' ', `ffprobe -v quiet -print_format json -show_format -show_streams /path/to/file 2>&1`)); 

चेतावनी दी जानकारी होनी चाहिए कि भ्रष्ट फ़ाइल के मामले में आप अपने त्रुटि की सूचना सेटिंग के आधार पर null परिणाम और चेतावनी के रूप में मिल जाएगा।उचित त्रुटि हैंडलिंग के साथ पूर्ण करें उदाहरण:

$file = '/path/to/file'; 
$cmd = 'ffprobe -v quiet -print_format json -show_format -show_streams ' . escapeshellarg($file).' 2>&1'; 

exec($cmd, $output, $code); 
if ($code != 0) { 
    throw new ErrorException("ffprobe returned non-zero code", $code, $output); 
} 

$joinedOutput = join(' ', $output); 
$parsedOutput = json_decode($joinedOutput); 
if (null === $parsedOutput) { 
    throw new ErrorException("Unable to parse ffprobe output", $code, $output); 
} 

//here we can use $parsedOutput as simple stdClass 
0

आप MediaInfo उपयोग कर सकते हैं:

$videoCodec = `mediainfo --Inform="Video;%Format%" $filename`; 
$audioCodec = `mediainfo --Inform="Audio;%Format%" $filename`; 

:

sudo apt-get install mediainfo 

तुम सिर्फ वीडियो/ऑडियो कोडेक प्राप्त करना चाहते हैं, तो आप निम्न कर सकते हैं यदि आप अधिक जानकारी प्राप्त करना चाहते हैं, तो आप mediainfo द्वारा लौटाए गए एक्सएमएल आउटपुट का विश्लेषण कर सकते हैं। यहां नमूना फ़ंक्शन है:

function getCodecInfo($inputFile) 
{ 
    $cmdLine = 'mediainfo --Output=XML ' . escapeshellarg($inputFile); 

    exec($cmdLine, $output, $retcode); 
    if($retcode != 0) 
     return null; 

    try 
    { 
     $xml = new SimpleXMLElement(join("\n",$output)); 
     $videoCodec = $xml->xpath('//track[@type="Video"]/Format'); 
     $audioCodec = $xml->xpath('//track[@type="Audio"]/Format'); 
    } 
    catch(Exception $e) 
    { 
     return null; 
    } 

    if(empty($videoCodec[0]) || empty($audioCodec[0])) 
     return null; 

    return array(
     'videoCodec' => (string)$videoCodec[0], 
     'audioCodec' => (string)$audioCodec[0], 
    ); 
} 
संबंधित मुद्दे