2009-11-10 11 views
16

मैं अपने सी # प्रोग्राम के भीतर से एक वीडियो फ़ाइल को परिवर्तित करने के लिए एफएफएमपीईजी का उपयोग करने में सक्षम होना चाहता हूं। मुझे पता है कि मैं सिर्फ शेल कमांड, पर कॉल कर सकता हूं लेकिन क्या कोई बेहतर तरीका है?सी # और एफएफएमपीजी अधिमानतः शैल कमांड के बिना?

खोल के माध्यम से एक आदेश का आह्वान करने वाला मुद्दा, क्या मुझे यकीन नहीं है कि आप प्रगति पट्टी आदि जैसे चीजें कर सकते हैं ... या आप कर सकते हैं?

यदि कोई रास्ता नहीं है, तो क्या कोई भी शेल कमांड निष्पादित करने के लिए कुछ ढांचे को लेआउट करने का सबसे अच्छा तरीका सुझा सकता है। एक बड़ी लंबी स्ट्रिंग पास करना बहुत बोझिल एटीएम है।

+0

कोई भी? चलो, किसी ने .net –

उत्तर

33

यदि आप ffmpeg चला रहे हैं तो आप आसानी से प्रगति पट्टी को कार्यान्वित कर सकते हैं। प्रति सेकंड

frame= 3366 fps=465 q=31.0 Lsize= 6474kB time=140.35 bitrate= 377.9kbits/s 

और यह ताज़ा किया जाता है ~ दो बार: जबकि चल रहा है ffmpeg के उत्पादन की तरह कुछ है। आप उस पंक्ति को पार्स कर सकते हैं और प्रगति को प्रदर्शित करने के लिए आवश्यक डेटा प्राप्त कर सकते हैं। जब आप कमांड लाइन में भागते हैं, तो आप केवल एक पंक्ति को हर समय अद्यतन करते देखते हैं, लेकिन \ r के बाद लाइन लिखने के लिए ffmpeg क्या होता है। यही कारण है कि आप कई लाइनें नहीं देखते हैं। हालांकि, प्रोग्राम के त्रुटि आउटपुट पर StreamReader.ReadLine() का उपयोग करते समय, आपको प्रत्येक अपडेट के लिए एक पंक्ति मिलती है।

आउटपुट पढ़ने के लिए नमूना कोड निम्नानुसार है। आपको किसी भी रेखा को अनदेखा करना होगा जो 'फ्रेम' से शुरू नहीं होता है, शायद BeginErrorReadLine() + ErrorDataReceived का उपयोग करें यदि आप लाइनों को एसिंक्रोनस आदि पढ़ना चाहते हैं, लेकिन आपको विचार मिलता है (मैंने वास्तव में इसका परीक्षण किया है):

using System; 
using System.Diagnostics; 
using System.IO; 

class Test { 
     static void Main (string [] args) 
     { 
       Process proc = new Process(); 
       proc.StartInfo.FileName = "ffmpeg"; 
       proc.StartInfo.Arguments = "-i " + args [0] + " " + args [1]; 
       proc.StartInfo.RedirectStandardError = true; 
       proc.StartInfo.UseShellExecute = false; 
       if (!proc.Start()) { 
         Console.WriteLine ("Error starting"); 
         return; 
       } 
       StreamReader reader = proc.StandardError; 
       string line; 
       while ((line = reader.ReadLine()) != null) { 
         Console.WriteLine (line); 
       } 
       proc.Close(); 
     } 
} 
+0

अहह ... मैं मानक आउटपुट पर रीडायरेक्ट करने की कोशिश कर रहा हूं ... त्रुटि नहीं। यह अचानक काम करता है: पी –

+0

+1: मैंने जावा में एक ही काम किया है और परिणाम से बहुत खुश हूं। कुछ कैच हैं, यद्यपि: 'टाइम' मान की तरह, पहले अपडेट के लिए प्रगति लाइन आउटपुट 100000000 की तरह कुछ हो सकता है। मेरा आंत कहता है कि यह एक आंतरिक प्रारंभिक मूल्य है। –

+0

शायद हाँ। एक निश्चित उचित सीमा के ऊपर मूल्यों को खत्म करने के लिए बस एक अनुमानित कथन का उपयोग करें। गंदा, लेकिन यह –

6

.NET के लिए FFmpeg पर wrapper लाइब्रेरी है।

+0

के साथ ffmpeg का उपयोग किया होगा "वर्तमान में ऑडियो डिकोडिंग और एन्कोडिंग परिपक्व हैं और वीडियो क्षमताएं विकास में हैं (वर्तमान में हमारे पास वीडियो डिकोडिंग काम कर रही है लेकिन बिना सिंक किए गए ऑडियो के)।" मुझे ऑडियो ठीक से काम करने की ज़रूरत है। –

+0

मुझे लगता है जैसे वे इस पर हैं, लेकिन यह अभी तक नहीं है ... – Abel

+0

दुर्भाग्य से, परियोजना को +2 साल पहले से ऊपर की टिप्पणियों के बाद अद्यतन नहीं किया गया है। और कोई द्विआधारी वितरण नहीं है; आपको कोड देखना और इसे स्वयं बनाना है। –

2

ffmpeg के मूल इंटरफ़ेस के आस-पास एक सी ++/सीएलआई रैपर लिखने और फिर अपने एप्लिकेशन से अपने रैपर इंटरफ़ेस को कॉल करने के बारे में कैसे?

+1

वीसी कंपाइलर ffmpeg में उपयोग की जाने वाली कई सी भाषा संरचनाओं का समर्थन नहीं करता है। एफएमपीपीईजी टीम किसी को वीसी को कोड पोर्ट करने में सफल होने में दिलचस्पी लेती है। –

2

मुझे स्रोतफोर्ज पर fflib मिला। बहुत आशाजनक लग रहा है, हालांकि इसका इस्तेमाल नहीं किया है।

+0

कोई पूरा नमूना काम करेगा? – Kiquenet

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