9

में उपयोग करते हुए 264 संपीड़न मैं OpenCV में VideoWriter वर्ग के साथ का उपयोग कर 264 संपीड़न एक वीडियो कैसे लिख सकता हूँ लेखन? मैं मूल रूप से वेबकैम से एक वीडियो प्राप्त करना चाहता हूं और एक चरित्र दबाए जाने के बाद इसे सहेजना चाहता हूं। MPEG4 भाग 2 संपीड़न का उपयोग करते समय आउटपुट वीडियो फ़ाइल विशाल है।एक वीडियो फ़ाइल OpenCV

उत्तर

16

आप निश्चित रूप से VideoWriter कक्षा का उपयोग कर सकते हैं, लेकिन आपको the correct FourCC code का उपयोग करने की आवश्यकता है जो H264 मानक का प्रतिनिधित्व करता है। चार सीसीसी चार कैरेक्टर कोड के लिए खड़ा है, जो मीडिया फाइलों में इस्तेमाल किए गए वीडियो कोडेक, संपीड़न प्रारूप, रंग या पिक्सेल प्रारूप के लिए पहचानकर्ता है।

विशेष रूप से, जब आप एक VideoWriter वस्तु बनाने, आप FourCC कोड जब यह निर्माण निर्दिष्ट करें। अधिक जानकारी के लिए OpenCV डॉक्स से परामर्श करें: http://docs.opencv.org/trunk/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter

मैं तुम्हें सी का उपयोग कर रहे संभालने हूँ ++, और इसलिए VideoWriter निर्माता की परिभाषा है:

VideoWriter::VideoWriter(const String& filename, int fourcc, 
         double fps, Size frameSize, bool isColor=true) 

filename वीडियो फ़ाइल का आउटपुट है, fourcc कोड आप उपयोग करना चाहते के लिए FourCC कोड है, fps, वांछित फ्रेम दर है frameSize वीडियो के वांछित आयाम है, और isColor निर्दिष्ट करता है या नहीं, आप वीडियो रंग में होना चाहता हूँ। भले ही FourCC चार वर्णों का उपयोग करता, OpenCV एक उपयोगिता है कि FourCC पार्स करता है और एक भी पूर्णांक आईडी जो फाइल करने के लिए सही वीडियो प्रारूप में लिखने के लिए सक्षम होने के लिए एक देखने के रूप में प्रयोग किया जाता है आउटपुट है। आप CV_FOURCC फ़ंक्शन का उपयोग करें, और चार एकल वर्ण निर्दिष्ट - प्रत्येक कोडेक आप चाहते हैं की FourCC कोड में एक भी चरित्र के लिए इसी।

विशेष रूप से, आप इसे इस तरह कहेंगे:

int fourcc = CV_FOURCC('X', 'X', 'X', 'X'); 

हर किरदार कि (क्रम में) FourCC के अंतर्गत आता है के साथ X बदलें। क्योंकि आप H264 मानक चाहते हैं, आप तो जैसे एक VideoWriter वस्तु बनाने होगा:

VideoWriter outputVideo(filename, fourcc, fps, S); 

आप ऊपर का उपयोग करते हैं, यह: वैकल्पिक रूप से

#include <iostream> // for standard I/O 
#include <string> // for strings 

#include <opencv2/core/core.hpp>  // Basic OpenCV structures (cv::Mat) 
#include <opencv2/highgui/highgui.hpp> // Video write 

using namespace std; 
using namespace cv; 

int main() 
{ 
    VideoWriter outputVideo; // For writing the video 

    int width = ...; // Declare width here 
    int height = ...; // Declare height here 
    Size S = Size(width, height); // Declare Size structure 

    // Open up the video for writing 
    const string filename = ...; // Declare name of file here 

    // Declare FourCC code 
    int fourcc = CV_FOURCC('H','2','6','4'); 

    // Declare FPS here 
    int fps = ...; 
    outputVideo.open(filename, fourcc, fps, S); 

    // Put your processing code here 
    // ... 

    // Logic to write frames here... see below for more details 
    // ... 

    return 0; 
} 

, तो आप बस जब अपने VideoWriter वस्तु की घोषणा ऐसा कर सकता है जरूरी नहीं है कि आप open इस रूप में कहते हैं स्वचालित रूप से दाखिल करने के लिए फ्रेम लिखने के लिए लेखक खुल जाएगा।


आप यकीन है कि अगर 264 आपके कंप्यूटर पर समर्थित है नहीं कर रहे हैं, FourCC कोड के रूप में -1 निर्दिष्ट करें, और एक पॉप-अप विंडो जब आप कोड है कि उपलब्ध वीडियो कोडेक के सभी प्रदर्शित करता है चलाना चाहिए कि आपके कंप्यूटर पर हैं मैं यह उल्लेख करना चाहता हूं कि यह केवल विंडोज के लिए काम करता है। जब आप -1 निर्दिष्ट करते हैं तो लिनक्स या मैक ओएस में यह विंडो पॉप-आउट नहीं होती है। दूसरे शब्दों में:

VideoWriter outputVideo(filename, -1, fps, S); 

आप चुन सकते हैं कि कौन सा सबसे उपयुक्त है H.264 आपके कंप्यूटर पर मौजूद नहीं होना चाहिए। एक बार ऐसा करने के बाद, ओपनसीवी VideoWriter कन्स्ट्रक्टर में इनपुट करने के लिए सही चारसीसी कोड बनाएगा ताकि आपको एक वीडियोवाइटर उदाहरण मिलेगा जो VideoWriter का प्रतिनिधित्व करता है जो उस प्रकार के वीडियो को फ़ाइल में लिख देगा।

एक बार जब आप एक फ्रेम तैयार, फ़ाइल के लिए लिखने के लिए frm में जमा हो जाती है, तो आप क्या कर सकते हैं या तो:

या

outputVideo.write(frm); 

एक बोनस के रूप में, यहाँ एक ट्यूटोरियल है कैसे पढ़ने के लिए पर/OpenCV में वीडियो लिखें: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html - हालांकि, यह अजगर के लिए लिखा है, लेकिन क्या पता करने के लिए लिंक के नीचे स्थित है अच्छा है, वहाँ है कि wor के लिए जाना जाता FourCC कोड की एक सूची है प्रत्येक ऑपरेटिंग सिस्टम के लिए के। बीटीडब्ल्यू, एच 264 मानक के लिए निर्दिष्ट चार सीसीसी कोड वास्तव में 'X','2','6','4' है, इसलिए 'H','2','6','4' काम नहीं करता है, X के साथ प्रतिस्थापित करें।

एक और छोटी टिप्पणी। यदि आप मैक ओएस का उपयोग कर रहे हैं, तो आपको 'A','V','C','1' या 'M','P','4','V' का उपयोग करने की आवश्यकता है। अनुभव से, 'H','2','6','4' या 'X','2','6','4' फ़ोरसीसी कोड निर्दिष्ट करने का प्रयास करते समय काम नहीं लगता है।

+0

मैंने कार्यक्रम की कोशिश की। सबसे पहले जब मैंने फोरक पैरामीटर का उपयोग करने की कोशिश की- -1 खिड़की नहीं चली गई। जब मैंने x264 का उपयोग करने का प्रयास किया जैसा आपने बताया था, मुझे "कोडेक नहीं खोल सका: libx264" त्रुटि और कुछ अन्य त्रुटियां जैसे "टूटी हुई एफएमपीईपीई डिफ़ॉल्ट सेटिंग्स का पता चला" .. मुझे बीटीडब्ल्यू क्या करना चाहिए Iubuntu 14.04 –

+1

का मतलब है कि इसका मतलब है कि आपके पास नहीं है एच 264 पुस्तकालय .... यह सब एक साथ एक और पोस्ट है। जब मैं काम करता हूं, तो मैं आपको एक लिंक दूंगा। बीटीडब्ल्यू -1 केवल विंडोज़ में काम करता है। इसका भी उल्लेख करना भूल गए। ऊप्स! – rayryeng

+0

धन्यवाद .. जब आप h264 lib स्थापना पर काम करते हैं तो मुझे बताएं। । मुझे बेहद जानना चाहिए –