2012-09-04 36 views
5

मैं कई डेस्कटॉप कैप्चर की गई छवियों को एन्कोडर्स (एफएफएमपीईजी) stdin में भेजने की कोशिश कर रहा हूं।प्रक्रिया में छवि लिखने का तेज़ तरीका। मानक इनपुट। बेसस्ट्रीम

निम्नलिखित कोड उदाहरण काम करता है।

CaptureScreen() फ़ंक्शन 5-10 एमएस में एक छवि प्रदान करता है।

यदि मैं मेमोरीस्ट्रीम में छवि को सहेजता हूं तो इसमें लगभग कोई समय नहीं लगता है।

लेकिन मैं केवल proc.StandardInput.BaseStream को 1 छवि हर 45 एमएस बचा सकता है।

public void Start(string bitrate, string buffer, string fps, string rtmp, string resolution, string preset) 
{ 
    proc.StartInfo.FileName = myPath + "\\ffmpeg.exe"; 
    proc.StartInfo.Arguments = "-f image2pipe -i pipe:.bmp -vcodec libx264 -preset " + preset + " -maxrate " + bitrate + "k -bufsize " + 
    buffer + "k -bt 10 -r " + fps + " -an -y test.avi"; //+ rtmp; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.RedirectStandardInput = true; 
    proc.StartInfo.RedirectStandardOutput = true; 

    proc.Start(); 

    Stopwatch st = new Stopwatch(); 
    BinaryWriter writer = new BinaryWriter(proc.StandardInput.BaseStream); 
    System.Drawing.Image img; 

    st.Reset(); 
    st.Start(); 

    for (int z = 0; z < 100; z++) 
    { 
     img = ScrCap.CaptureScreen(); 
     img.Save(writer.BaseStream, System.Drawing.Imaging.ImageFormat.Bmp); 
     img.Dispose(); 
    } 

    st.Stop(); 
    System.Windows.Forms.MessageBox.Show(st.ElapsedMilliseconds.ToString()); 
} 

सवाल यह है:

मैं बचत की प्रक्रिया तेजी से कर सकता हूँ?

मैं इस तरह से

+0

क्या आपने 'ImageFormat.png' का उपयोग करने का प्रयास किया है, इसलिए पढ़ने/लिखे जाने वाले डेटा की वास्तविक मात्रा कम हो गई है? – PhonicUK

+0

मैंने कोशिश की। इसकी धीमी गति से ... 130 एमएस – Hasibii

उत्तर

2

टोंटी यहाँ कि ffmpeg उसी गति यह संपीड़ित करता है यह .avi के लिए है, जो धीमी है पर डेटा पढ़ता है पाने के लिए स्थिर 60 fps प्रयास करें। तो आपके img.Save विधि ब्लॉक तब तक होते हैं जब तक स्ट्रीम के बफर में कुछ डेटा नहीं होता है।

आप ऐसा नहीं कर सकते हैं। वास्तविक समय में 60 एफपीएस एचडी वीडियो को संपीड़ित करने के लिए एक बड़ी प्रोसेसिंग पावर की आवश्यकता होती है।

+1

की तरह चीजों को गति देने के लिए ffmpeg बताने का कोई तरीका है? मेरा मतलब है कि यह संभव होना चाहिए क्योंकि मैंने अतीत में रीयलटाइम 60 एफपीएस एचडी किया था और ffmpeg केवल 7% सीपीयू पावर का उपयोग कर रहा है। – Hasibii

+1

आपको यह पता लगाना होगा कि श्रृंखला को अवरुद्ध कर रहा है। छवि कैप्चरिंग? बीएमपी को एन्कोडिंग? इसे ffmpeg पर भेज रहा है? इसे एक .avi को संपीड़ित करना? परिणामी वीडियो को हार्ड डिस्क पर लिखना? –

+0

इसे इसे ffmpeg पर भेजना है .. मैंने बीएमपी को दूसरी स्ट्रीम में लिखने की कोशिश की और इसमें लगभग कोई समय नहीं लगा। क्या नामित पाइप का उपयोग करना तेज़ हो सकता है? – Hasibii