c++ - सी++: वीडियो फ़ाइल खोलने के लिए सबसे आसान लाइब्रेरी क्या है




स्कूल लाइब्रेरी (5)

अगर यह एवीआई फाइलों के लिए है तो मैं एवीआई फ़ाइल से डेटा को पढ़ सकता हूं और फ़्रेम को निकालता हूं। अब इसे विघटित करने के लिए वीडियो संपीड़न प्रबंधक का उपयोग करें।

एवीआई फ़ाइल स्वरूप बहुत सरल है, देखें: http://msdn.microsoft.com/en-us/library/dd318187(VS.85).aspx (और Google का उपयोग करें)।

आपके पास फाइल खोलने के बाद ही आप प्रत्येक फ्रेम को निकालें और उसे आईसीडीईम्प्रेस () में डाल दें ताकि इसे डीकंप्रेस कर सकें।

यह बहुत काम जैसा लगता है लेकिन यह सबसे विश्वसनीय तरीका है

अगर यह बहुत अधिक काम है, या अगर आप AVI फ़ाइलों से अधिक चाहते हैं तो फ़ेमपीएफ़ का उपयोग करें।

मैं एक छोटी सी वीडियो फ़ाइल खोलना चाहूंगा और मेमोरी में हर फ़्रेम का नक्शा (कुछ कस्टम फ़िल्टर लागू करने के लिए) मैं वीडियो कोडेक को संभाल नहीं करना चाहता, मैं पुस्तकालय को मेरे लिए उस स्थान पर रखूँगा

मैंने नमूनाग्राबर फ़िल्टर के साथ डायरेक्ट शो का उपयोग करने की कोशिश की है (इस नमूना http://msdn.microsoft.com/en-us/library/ms787867(VS.85).aspx का उपयोग करके), लेकिन मैं केवल कुछ तख्ते (हर फ्रेम नहीं!)। मैं वीडियो सॉफ्टवेयर प्रोग्रामिंग में काफी नया हूँ, शायद मैं सर्वश्रेष्ठ पुस्तकालय का उपयोग नहीं कर रहा हूँ, या मैं इसे गलत कर रहा हूं

मैंने अपने कोड का एक हिस्सा चिपका लिया है (मुख्य रूप से एमएसडीएन उदाहरण से एक संशोधित प्रतिलिपि / पेस्ट), दुर्भाग्य से यह 25 पहले फ़्रेमों को अपेक्षित रूप से नहीं पकड़ा है ...

[...]

hr = pGrabber->SetOneShot(TRUE);
hr = pGrabber->SetBufferSamples(TRUE);

pControl->Run(); // Run the graph.
pEvent->WaitForCompletion(INFINITE, &evCode); // Wait till it's done.

// Find the required buffer size.
long cbBuffer = 0;
hr = pGrabber->GetCurrentBuffer(&cbBuffer, NULL);

for( int i = 0 ; i < 25 ; ++i )
{
    pControl->Run(); // Run the graph.
    pEvent->WaitForCompletion(INFINITE, &evCode); // Wait till it's done.

    char *pBuffer = new char[cbBuffer];
    hr = pGrabber->GetCurrentBuffer(&cbBuffer, (long*)pBuffer);

    AM_MEDIA_TYPE mt;
    hr = pGrabber->GetConnectedMediaType(&mt);
    VIDEOINFOHEADER *pVih;
    pVih = (VIDEOINFOHEADER*)mt.pbFormat;

    [...]
}

[...]

क्या कोई वीडियो सॉफ्टवेयर अनुभव के साथ है, जो मुझे कोड या अन्य सरल लाइब्रेरी के बारे में सलाह दे सकता है?

धन्यवाद

संपादित करें: एमएसडीएन लिंक्स काम नहीं कर रहे हैं ( बग देखें )


ओपनसीवी सबसे अच्छा समाधान है यदि आपके मामले में वीडियो को चित्रों के अनुक्रम की आवश्यकता होती है यदि आप असली वीडियो प्रसंस्करण करने के लिए तैयार हैं, तो ViDeo "विज़ुअल ऑडियो" के बराबर है, आपको "मार्शनो" द्वारा प्रस्तुत किए गए लोगों के साथ ट्रैक बनाए रखना होगा। Win7 के लिए नए विंडोज़ समाधान भी इसमें 3 नई संभावनाएं शामिल हैं:

  1. विंडोज मीडिया फाउंडेशन: डायरेक्ट शो के उत्तराधिकारी; साफ-अप इंटरफ़ेस
  2. विंडोज मीडिया एन्कोडर 9: इसमें केवल प्रोग्राम शामिल नहीं है, यह कोडिंग के लिए जहाज की लाइब्रेरी भी है
  3. विंडोज एक्सप्रेशन 4: 2 का उत्तराधिकारी

पिछले 2 वाणिज्यिक केवल समाधान हैं, लेकिन पहले एक मुफ्त है डब्ल्यूएमएफ कोड के लिए, आपको विंडोज एसडीके को स्थापित करना होगा।


मैं जानता हूं कि यह वीडियो फ़ाइलों का उचित ब्रेकडाउन करने के लिए सी ++ में बहुत ही आकर्षक है और सिर्फ खुद ही करता है लेकिन हालांकि जानकारी वहां से बाहर है, लेकिन यह हर तरह की लम्बी वांछित प्रक्रिया वाली कक्षाएं है जो प्रत्येक फ़ाइल प्रारूप को हाथ में लेती है, और भविष्य में संरचना परिवर्तनों को ध्यान में रखकर इसे आसानी से बदल सकती है, यह स्पष्ट रूप से प्रयास के लायक नहीं है।

इसके बजाय मैं सिफारिश ffmpeg इसके ऊपर उल्लेख किया गया है, लेकिन यह कहना मुश्किल है, यह मुश्किल नहीं है। अधिकांश लोगों की तुलना में बहुत अधिक विकल्प हैं जो इसे जितना कठिन बना देता है, उतना मुश्किल होता है। अधिकांश आपरेशनों के लिए आप केवल एफएफपीएजी को अपने लिए काम कर सकते हैं।

उदाहरण के लिए एक फ़ाइल कनवर्ज़न ffmpeg -i inputFile.mp4 outputFile.avi

शुरू से ही तय करें कि आपके पास एक थ्रेड में चलने वाले ffmpeg ऑपरेशन होंगे, या अधिक सटीक रूप से एक थ्रेड लाइब्रेरी। लेकिन अपनी खुद की धागा वर्ग इसे लपेटो ताकि आप अपना खुद का इवेंटएज कर सकें और थ्रेड की जाँच करने के तरीके समाप्त हो जाएंगे। कुछ इस तरह :-

ThreadLibManager()
{
  List<MyThreads> listOfActiveThreads;
  public AddThread(MyThreads);
}
Your thread class is something like:-
class MyThread
{
 public Thread threadForThisInstance { get; set; }
 public MyFFMpegTools mpegTools { get; set; }
}
MyFFMpegTools performs many different video operations, so you want your own event  
args to tell your parent code precisely what type of operation has just raised and 
event.
enum MyFmpegArgs
{
public int thisThreadID { get; set; } //Set as a new MyThread is added to the List<>
public MyFfmpegType operationType {get; set;}
//output paths etc that the parent handler will need to find output files
}
enum MyFfmpegType
{
  FF_CONVERTFILE = 0, FF_CREATETHUMBNAIL, FF_EXTRACTFRAMES ...
}

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

वैसे भी, यह विंडोलेस एफएफपीएजी का उपयोग करने का एक उदाहरण है।

        public string GetVideoInfo(FileInfo fi)
    {
        outputBuilder.Clear();
        string strCommand = string.Concat(" -i \"", fi.FullName, "\"");
        string ffPath =   
  System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\ffmpeg.exe";
        string oStr = "";

        try
        {
            Process build = new Process();
            //build.StartInfo.WorkingDirectory = @"dir";
            build.StartInfo.Arguments = strCommand;
            build.StartInfo.FileName = ffPath;

            build.StartInfo.UseShellExecute = false;
            build.StartInfo.RedirectStandardOutput = true;
            build.StartInfo.RedirectStandardError = true;
            build.StartInfo.CreateNoWindow = true;
            build.ErrorDataReceived += build_ErrorDataReceived;
            build.OutputDataReceived += build_ErrorDataReceived;
            build.EnableRaisingEvents = true;
            build.Start();
            build.BeginOutputReadLine();
            build.BeginErrorReadLine();
            build.WaitForExit();


            string findThis = "start";
            int offset = 0;
            foreach (string str in outputBuilder)
            {
                if (str.Contains("Duration"))
                {
                    offset = str.IndexOf(findThis);
                    oStr = str.Substring(0, offset);
                }
            }
        }
        catch
        {
            oStr = "Error collecting file information";
        }

        return oStr;
    }
    private void build_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        string strMessage = e.Data;
        if (outputBuilder != null && strMessage != null)
        {
            outputBuilder.Add(string.Concat(strMessage, "\n"));
        }
    } 

मैंने ओपनसीवी का उपयोग वीडियो फाइलों को लोड करने के लिए और उन्हें प्रोसेस करने के लिए किया है। यह कई प्रकार के वीडियो प्रोसेसिंग के लिए भी उपयोगी है, जो कंप्यूटर दृष्टि के लिए उपयोगी हैं।


OpenCV पुस्तकालय का उपयोग करने की कोशिश करें यह निश्चित रूप से आपके लिए आवश्यक क्षमताओं की आवश्यकता होती है।

इस गाइड में एक वीडियो फ़ाइल से फ्रेम तक पहुंचने के बारे में एक अनुभाग है।





video