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




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

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

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

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

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

मैंने नमूनाग्राबर फ़िल्टर के साथ डायरेक्ट शो का उपयोग करने की कोशिश की है (इस नमूना 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;

    [...]
}

[...]

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

धन्यवाद

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


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

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

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

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

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


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


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

इसके बजाय मैं सिफारिश 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 पुस्तकालय का उपयोग करने की कोशिश करें यह निश्चित रूप से आपके लिए आवश्यक क्षमताओं की आवश्यकता होती है।

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


वर्तमान में ये Win32 प्लेटफॉर्म पर उपलब्ध सबसे लोकप्रिय वीडियो फ़्रेमवर्क हैं:

  1. विन्डोज़ के लिए वीडियो: विन्ड 9 की उम्र से आने वाली पुरानी खिड़कियां ढांचा, लेकिन अभी भी व्यापक रूप से उपयोग किया जाता है क्योंकि इसका प्रयोग करना बहुत आसान है। दुर्भाग्य से यह केवल AVI फ़ाइलों का समर्थन करता है जिसके लिए उचित VFW कोडेक स्थापित किया गया है।

  2. DirectShow: मानक WinXP ढांचे, यह मूल रूप से सभी प्रारूपों को लोड कर सकते हैं जिन्हें आप Windows Media Player के साथ खेल सकते हैं। प्रयोग करने में मुश्किल है।

  3. Ffmpeg : अधिक सटीक libavcodec और libavformat जो Ffmpeg ओपन सोर्स मल्टीमीडिया उपयोगिता के साथ आता है। यह अत्यंत शक्तिशाली है और बहुत सारे स्वरूप (लगभग सभी चीजें जो आप वीएलसी के साथ खेल सकते हैं) पढ़ सकते हैं भले ही आपके पास सिस्टम पर कोडेक स्थापित न हो। यह उपयोग करने के लिए काफी जटिल है लेकिन आप हमेशा एफएफपीपी के कोड से प्रेरित हो सकते हैं जो इसके साथ या ओपन सोर्स सॉफ़्टवेयर के अन्य कार्यान्वयन से आता है। वैसे भी मुझे लगता है कि डीएस (और बहुत तेज़) से इसका उपयोग करना अभी भी बहुत आसान है। इसे विंडोज पर मिनजीड द्वारा विकसित करने की जरूरत है, लेकिन सभी चरणों को बहुत अच्छी तरह से समझाया गया है (इस समय में लिंक नीचे है, आशा नहीं है मृत)।

  4. क्विकटाइम : ऐप्पल फ़्रेमवर्क विंडोज प्लेटफ़ॉर्म के लिए सबसे अच्छा समाधान नहीं है, चूंकि इसे स्थापित करने के लिए क्विकटाइम ऐप की आवश्यकता होती है और प्रत्येक फॉर्मेट के लिए उचित क्विकटाइम कोडेक भी होता है; यह कई प्रारूपों का समर्थन नहीं करता है, लेकिन यह पेशेवर फ़ील्ड में काफी सामान्य है (इसलिए कुछ कोडेक वास्तव में केवल QuickTime के लिए हैं) को लागू करने के लिए बहुत मुश्किल नहीं होना चाहिए

  5. Gstreamer : नवीनतम ओपन सोर्स फ्रेमवर्क मुझे इसके बारे में ज्यादा जानकारी नहीं है, मुझे लगता है कि यह कुछ अन्य प्रणालियों पर लपेटता है (लेकिन मुझे यकीन नहीं है)।

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





video