लिनक्स में कमांड-लाइन वीडियो संपादन (कट, जॉइन और प्रीव्यू)


32

मुझे सरल संपादन की आवश्यकता है - मुझे कुछ वीडियो काटने की आवश्यकता है, हो सकता है कि उनके बीच में कुछ पीएनजी डालें, और इन वीडियो में शामिल हों (संक्रमण, प्रभाव, आदि की आवश्यकता नहीं है)। मूल रूप से, pitiviमैं जो चाहता हूं - उसे छोड़कर, मैं एक कैमरे से 640x480 30 एफपीएस एवीआई का उपयोग करता हूं, और जैसे ही मैंने उस तरह की सामग्री के कुछ मिनटों में डाल दिया, pitiviपूर्वावलोकन पर ठंड लगना शुरू हो जाता है, और इस तरह अनुपयोगी हो जाता है।

इसलिए, मैंने लिनक्स के लिए कमांड लाइन टूल की तलाश शुरू की; मैं केवल अनुमान लगाता हूं ffmpeg( कमांड लाइन - वीडियो को काटने के लिए ffmpeg का उपयोग करना - सुपर उपयोगकर्ता ) और mplayer( सैम - लिनक्स के तहत मेन्कोडर के साथ वीडियो फ़ाइल को संपादित करना ) अब तक उम्मीदवार हैं, लेकिन मुझे उन उपयोगों के उदाहरण नहीं मिल सकते हैं जो मेरे दिमाग में हैं।

 

असल में, मुझे लगता है कि एक एनकोडर और प्लेयर टूल (जैसे ffmpegबनाम ffplay; या mencoderबनाम mplayer) - ऐसा होगा, जिसके साथ शुरू करने के लिए, संपादन क्रम को सीधे कमांड लाइन पर निर्दिष्ट किया जा सकता है, अधिमानतः फ्रेम रिज़ॉल्यूशन के साथ - एक छद्मकोड जैसा दिखेगा:

videnctool -compose --file=vid1.avi --start=00:00:30:12 --end=00:01:45:00 --file=vid2.avi --start=00:05:00:00 --end=00:07:12:25 --file=mypicture.png --duration=00:00:02:00 --file=vid3.avi --start=00:02:00:00 --end=00:02:45:10 --output=editedvid.avi

... या, इसमें "प्लेलिस्ट" पाठ फ़ाइल हो सकती है, जैसे:

vid1.avi      00:00:30:12 00:01:45:00 
vid2.avi      00:05:00:00 00:07:12:25 
mypicture.png -           00:00:02:00
vid3.avi      00:02:00:00 00:02:45:10 

... तो यह कहा जा सकता है

videnctool -compose --playlist=playlist.txt --output=editedvid.avi

यहाँ विचार यह होगा कि सभी वीडियो एक ही प्रारूप में हैं - टूल को ट्रांसकोडिंग से बचने की अनुमति देता है, और इसके बजाय केवल एक "कच्ची कॉपी" करता है (जैसा कि mencoder'' कॉपी कॉपी '' : ' -oac copy -ovc copy') - या इसके अभाव में, असम्पीडित ऑडियो / वीडियो ठीक होगा (हालांकि यह थोड़ी सी जगह खा जाएगा)। स्थिर छवि के मामले में, उपकरण वीडियो फ़ाइलों द्वारा सेट एन्कोडिंग का उपयोग करेगा।

 

बात यह है, मैं अब तक इसे देख सकता हूं mencoderऔर ffmpegव्यक्तिगत फाइलों पर काम कर सकता हूं; उदाहरण के लिए किसी एकल फ़ाइल से किसी एकल खंड को काटें, या फाइलों में शामिल हों ( mencoderइसमें एडिट डिसिजन लिस्ट (EDL) भी है , जिसका उपयोग फ्रेम-सटीक कटिंग के लिए किया जा सकता है - इसलिए आप कई कट क्षेत्रों को परिभाषित कर सकते हैं, लेकिन इसे फिर से एक फ़ाइल के लिए जिम्मेदार ठहराया गया है। )। तात्पर्य मुझे पहले व्यक्तिगत फ़ाइलों से टुकड़ों को काटने पर काम करना होगा (जिनमें से प्रत्येक डिस्क पर खुद की अस्थायी फ़ाइल की मांग करेगा), और फिर उन्हें अंतिम वीडियो फ़ाइल में शामिल करना।

मैं तब कल्पना करता हूं, कि एक संबंधित प्लेयर टूल है, जो एन्कोडिंग टूल के रूप में एक ही कमांड लाइन विकल्प प्रारूप / प्लेलिस्ट फाइल को पढ़ सकता है - इसके अलावा यह आउटपुट फाइल उत्पन्न नहीं करेगा, बल्कि वीडियो चलाएगा; स्यूडोकोड में उदा:

vidplaytool --playlist=playlist.txt --start=00:01:14 --end=00:03:13

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

इस प्रकार, इस सब का अंतिम परिणाम होगा: कमांड लाइन ऑपरेशन; संपादन करते समय कोई अस्थायी फ़ाइलें नहीं - और अंतिम आउटपुट प्रदान करते समय कोई अस्थायी फ़ाइलें (न ही ट्रांसकोडिंग) ... जो मुझे लगता है कि अच्छा होगा।

इसलिए, जबकि मुझे लगता है कि उपरोक्त सभी में थोड़ा खिंचाव हो सकता है - क्या ऐसा कुछ भी मौजूद है जो ऊपर वर्णित वर्कफ़्लो को अनुमानित करेगा?


1
जब मैं विडियो को विभाजित / जुड़ने की आवश्यकता होती है तो मैं अक्सर mkvmerge का उपयोग करता हूं।
वि।

इसके लिए धन्यवाद, @Vi। - पहले कभी नहीं सुना था mkvmerge, सुनिश्चित करूँगा कि मैं इसकी जाँच करूँ .. चीयर्स!
सदाउ

जवाबों:


17

हाँ वहाँ है। "पिघल" नामक ऐप का उपयोग करने का प्रयास करें। दस्तावेज यहाँ देखें:

https://www.mltframework.org/docs/melt/

यदि आप डेबियन व्युत्पन्न डिस्ट्रो का उपयोग करते हैं:

apt-get install melt

on mac:brew install mlt
kraftydevil

23

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

के साथ शुरू करने के लिए - के लिए एक उबंटू / डेबियन पैकेज है melt(मेरे पास उबटन 11.04 एमएलटी पिघल 0.6.2 के साथ है); @ आईल्टन द्वारा दिए गए लिंक "मीडिया लविन 'टूलकिट" ( एमएलटी ) विकी के लिए है, जो melt(लेकिन यह भी openshotऔर kdenlive) का एक हिस्सा है । यहाँ उनके गिट से प्रलेखन पाठ फ़ाइलों के लिए लिंक है: mltframework.org/mlt.git/tree - डॉक्स / ; ध्यान दें कि बिल्ड में लिपियों के बारे में एक पृष्ठ है ।

अभी के लिए, सबसे बड़ी (केवल) समस्या जो मेरे पास है, वह यह है कि मुझे एक असम्पीडित वीडियो रचना (या तो pngफ्रेम, या कुछ असम्पीडित वीडियो प्रारूप) को निर्यात करने का कोई तरीका नहीं मिल रहा है ।

 

सबसे पहले, कमांड-लाइन में meltआप फ़्रेम के माध्यम से प्लेबैक को नियंत्रित कर सकते हैं; उदाहरण के लिए, एक 15-फ्रेम लंबा सफेद रिक्त "बनाने" के लिए, और इसे अंतर्निहित meltखिलाड़ी के साथ देखें, उपयोग करें

melt -blank 15

जब आप देखते हैं melt, तो आपको stderrअंतर्निहित खिलाड़ी के लिए कमांड लाइन की जानकारी भी मिलेगी :

$ melt -blank 15 
+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+
|1=-10| |2= -5| |3= -2| |4= -1| |5=  0| |6=  1| |7=  2| |8=  5| |9= 10|
+-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+ +-----+
+---------------------------------------------------------------------+
|               H = back 1 minute,  L = forward 1 minute              |
|                 h = previous frame,  l = next frame                 |
|           g = start of clip, j = next clip, k = previous clip       |
|                0 = restart, q = quit, space = play                  |
+---------------------------------------------------------------------+
Current Position:         15

एक बार meltवापस खेलने के बाद, यह बाहर नहीं निकलेगा - इसलिए आपको qइसे बाहर निकलने के लिए लिखना चाहिए ।

हमें ध्यान देना चाहिए कि तथाकथित "निर्माता" और "उपभोक्ता" अंदर हैं melt। यदि कुछ भी निर्दिष्ट नहीं है, तो डिफ़ॉल्ट "उपभोक्ता" एक एसडीएल (सरल डायरेक्टमीडिया लेयर) है जो वीडियो को वापस खेल रहा है; इसलिए उपरोक्त आदेश समान है:

melt -blank 15 -consumer sdl

इस प्रकार, यदि हम जो meltप्रदर्शित करना चाहते हैं उसे सहेजना चाहते हैं, तो हमें उपभोक्ता को ऐसी चीज़ में बदलना चाहिए जो फ़ाइल प्रारूप का समर्थन करेगी। उपभोक्ताओं की सूची प्राप्त करने के लिए:

$ melt -query "consumers"
---
consumers:
  - sdl
  - sdl_audio
  - sdl_preview
  - sdl_still
  - gtk2_preview
  - avformat
  - libdv
  - xml
  - decklink
  - null
...

libdvउपभोक्ता इच्छा उत्पादन डीवी सीधे करने के लिए स्वरूपित डेटा stdout, तो एक करने के लिए वीडियो को बचाने के लिए .dvफ़ाइल तुम क्या चाहते हैं:

melt -blank 15 -consumer libdv > test.dv

ध्यान दें कि सूचीबद्ध उपभोक्ताओं से, मैंने केवल एक ही प्रारूप की कोशिश की है, जिसे किसी अन्य एप्लिकेशन में भी खोला जा सकता है libdv(मैं vlcदूसरे एप्लिकेशन के रूप में उपयोग किया जाता है); हालाँकि, यह एक भिन्न प्रकार के ट्रांसकोडिंग के लिए विफल हो सकता है ( जैसे कि यदि रिक्त के बजाय, मैं किसी .flvफ़ाइल से स्निपेट को बदलने की कोशिश करता हूं , तो .dv फ़ाइल खुलती है और इसमें खेलती है vlc, लेकिन भ्रष्ट है )।

 

अब संपादन भाग के लिए; अनिवार्य रूप से, आप सीधे कमांड लाइन पर फ़ाइल-नाम / इन / आउट आढ़तियों की एक श्रृंखला निर्दिष्ट कर सकते हैं ; कहते हैं कि आपके पास एक फ़ाइल है, video.avi- तब आप कर सकते हैं:

melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79

या थोड़ा बेहतर स्वरूपित:

melt \ 
video.avi in=30 out=79 \ 
-blank 15 \
video.avi in=30 out=79

इसका मतलब video.aviइसके फ्रेम 30 से इसके फ्रेम 79 तक खेला जाएगा; फिर एक 15-फ्रेम खाली; और फिर video.aviफ्रेम 30 से फ्रेम फिर से 79 तक अनुक्रम।

.pngएक वीडियो संपादित रचना में छवियों (कहना ) का उपयोग करने के लिए :

melt \
video.avi in=30 out=79 \
test.png in=0 out=15 \
video.avi in=30 out=79 \
-blank 15

के लिए ध्यान दें कि test.png, in=पैरामीटर 0 होने की जरूरत नहीं है - फिर भी, छवि के लिए प्रदर्शित किया जाएगा out- inसमय; इस मामले में, in=0पैरामीटर को पूरी तरह से छोड़ना आसान होगा ।

 

अच्छी बात यह है कि इस संपादन अनुक्रम को बचाया जा सकता है - या जैसा कि meltइसे कॉल किया जाता है, क्रमबद्ध - एक फ़ाइल के लिए; ध्यान दें कि इस तरह के क्रमांकन के दो तरीके हैं : "सरल" या एक्सएमएल। उदाहरण के लिए, उपरोक्त कमांड को "सरल" क्रमबद्ध फ़ाइल के रूप में सहेजने के लिए, हम केवल -serialise [filename]कमांड में स्विच जोड़ सकते हैं :

$ melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79 -serialise file.melt 
Project saved as file.melt.

अब file.meltइसमें शामिल हैं:

video.avi
in=30
out=79
-blank
15
video.avi
in=30
out=79

लगता है, इस "सरल" धारावाहिक फ़ाइल प्रारूप में "टिप्पणी" वर्ण शामिल नहीं है - अगर मैं एक " # comment" लाइन जोड़ने की कोशिश करता हूं , तो meltइसके साथ शिकायत करता है: '' टिप्पणी को लोड करने में विफल " " (लेकिन इसके अलावा, ऐसा लगता है कि ऐसा है) एक लाइन को अनदेखा किया जाता है, और प्लेबैक वैसे भी जारी रहता है)। " .melt" एक ऐसा विस्तार प्रतीत होता है जो meltसरल क्रमबद्ध फ़ाइल के रूप में पहचानता है।

अब, इस क्रमबद्ध फ़ाइल को फिर से चलाने के लिए, हम सिद्धांत रूप में कॉल कर सकते हैं melt file.melt- हालाँकि, एक अधिक पूर्ण कमांड लाइन होगी:

melt melt_file:file.melt -consumer sdl

... जिसका अर्थ होगा: melt_file"निर्माता" को खोलने के लिए उपयोग करें file.melt, और "उपभोक्ता" sdl(विंडो) पर इसके फ्रेम को प्रस्तुत करना ।

ध्यान दें कि मुझे अनुभव है, कि (कहते हैं) .flvवीडियो कमांड लाइन पर एक समस्या के बिना खेलते हैं - हालांकि, file.meltक्रमबद्ध फ़ाइल में निर्दिष्ट होने पर एक विभाजन दोष का कारण बनता है ! खुद .dvद्वारा निर्मित वीडियो melt, ठीक काम करने लगते हैं file.melt...

 

एक्सएमएल प्रकार के क्रमांकन को -consumer xml:स्विच ( ) के बजाय का-serialise उपयोग करके प्राप्त किया जा सकता है - इसलिए उपरोक्त उदाहरण अब होगा:

melt video.avi in=30 out=79 -blank 15 video.avi in=30 out=79 -consumer xml:file.mlt

नई जेनरेट की गई file.mltएक्सएमएल फाइल को "प्ले बैक" करने के लिए , एक अब सीधे कर सकता है melt file.mlt- या, एक पूरी कमांड लाइन होगी:

melt xml:file.mlt -consumer sdl

... जिसका अर्थ होगा: xml"निर्माता" ( ध्यान दें, पहले यह एक उपभोक्ता था ) का उपयोग करें file.mlt, और "उपभोक्ता" sdl(खिड़की) पर इसके फ्रेम को प्रस्तुत करना ।

ध्यान दें कि इस मामले में, मैंने अनुभव किया है कि बहुत ही .flvवीडियो जो एक साधारण क्रमांकन फ़ाइल के साथ सेगफॉल्ट का कारण बनता है - एक XML क्रमांकन फ़ाइल के साथ ठीक काम करता है!

इस मामले में, परिणामस्वरूप file.mltXML फ़ाइल में बहुत अधिक सेटिंग्स हैं, जैसे कि रिज़ॉल्यूशन, फ़्रेम दर, कोडेक जानकारी आदि - लेकिन यह सीधे टेक्स्ट एडिटर के साथ काम करना भी अधिक कठिन है:

<?xml version="1.0" encoding="utf-8"?>
<mlt root="/path/to" title="video.avi">
  <profile description="automatic" width="320" height="240" progressive="1" sample_aspect_num="1" sample_aspect_den="1" display_aspect_num="320" display_aspect_den="240" frame_rate_num="25" frame_rate_den="1" colorspace="601"/>
  <producer id="producer0" in="30" out="79">
    <property name="mlt_type">producer</property>
    <property name="aspect_ratio">1.000000</property>
    <property name="length">125</property>
    <property name="eof">pause</property>
    <property name="resource">video.avi</property>
    <property name="meta.media.nb_streams">2</property>
    <property name="meta.media.0.stream.type">video</property>
    <property name="meta.media.0.stream.frame_rate">25.000000</property>
    <property name="meta.media.0.stream.sample_aspect_ratio">0.000000</property>
    <property name="meta.media.0.codec.frame_rate">25.000000</property>
    <property name="meta.media.0.codec.pix_fmt">yuv420p</property>
    <property name="meta.media.0.codec.sample_aspect_ratio">1.000000</property>
    <property name="meta.media.0.codec.colorspace">601</property>
    <property name="meta.media.0.codec.name">mpeg4</property>
    <property name="meta.media.0.codec.long_name">MPEG-4 part 2</property>
    <property name="meta.media.0.codec.bit_rate">0</property>
    <property name="meta.media.1.stream.type">audio</property>
    <property name="meta.media.1.codec.sample_fmt">s16</property>
    <property name="meta.media.1.codec.sample_rate">22050</property>
    <property name="meta.media.1.codec.channels">1</property>
    <property name="meta.media.1.codec.name">mp2</property>
    <property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
    <property name="meta.media.1.codec.bit_rate">64000</property>
    <property name="seekable">1</property>
    <property name="meta.media.sample_aspect_num">1</property>
    <property name="meta.media.sample_aspect_den">1</property>
    <property name="meta.attr.title.markup"></property>
    <property name="meta.attr.author.markup"></property>
    <property name="meta.attr.copyright.markup"></property>
    <property name="meta.attr.comment.markup"></property>
    <property name="meta.attr.album.markup"></property>
    <property name="audio_index">1</property>
    <property name="video_index">0</property>
    <property name="mlt_service">avformat</property>
  </producer>
  <producer id="producer1" in="30" out="79">
    <property name="mlt_type">producer</property>
    <property name="aspect_ratio">1.000000</property>
    <property name="length">125</property>
    <property name="eof">pause</property>
    <property name="resource">video.avi</property>
    <property name="meta.media.nb_streams">2</property>
    <property name="meta.media.0.stream.type">video</property>
    <property name="meta.media.0.stream.frame_rate">25.000000</property>
    <property name="meta.media.0.stream.sample_aspect_ratio">0.000000</property>
    <property name="meta.media.0.codec.frame_rate">25.000000</property>
    <property name="meta.media.0.codec.pix_fmt">yuv420p</property>
    <property name="meta.media.0.codec.sample_aspect_ratio">1.000000</property>
    <property name="meta.media.0.codec.colorspace">601</property>
    <property name="meta.media.0.codec.name">mpeg4</property>
    <property name="meta.media.0.codec.long_name">MPEG-4 part 2</property>
    <property name="meta.media.0.codec.bit_rate">0</property>
    <property name="meta.media.1.stream.type">audio</property>
    <property name="meta.media.1.codec.sample_fmt">s16</property>
    <property name="meta.media.1.codec.sample_rate">22050</property>
    <property name="meta.media.1.codec.channels">1</property>
    <property name="meta.media.1.codec.name">mp2</property>
    <property name="meta.media.1.codec.long_name">MP2 (MPEG audio layer 2)</property>
    <property name="meta.media.1.codec.bit_rate">64000</property>
    <property name="seekable">1</property>
    <property name="meta.media.sample_aspect_num">1</property>
    <property name="meta.media.sample_aspect_den">1</property>
    <property name="meta.attr.title.markup"></property>
    <property name="meta.attr.author.markup"></property>
    <property name="meta.attr.copyright.markup"></property>
    <property name="meta.attr.comment.markup"></property>
    <property name="meta.attr.album.markup"></property>
    <property name="audio_index">1</property>
    <property name="video_index">0</property>
    <property name="mlt_service">avformat</property>
  </producer>
  <playlist id="playlist0">
    <entry producer="producer0" in="0" out="49"/>
    <blank length="16"/>
    <entry producer="producer1" in="0" out="49"/>
  </playlist>
  <tractor id="tractor0" title="video.avi" global_feed="1" in="0" out="115">
    <track producer="playlist0"/>
  </tractor>
</mlt>

इसके अलावा, यहाँ फ्रेम-सटीक कटौती के लिए एक उदाहरण दिया गया है: कमांड लाइन से सटीक रूप से कटी हुई वीडियो फाइलें - सुपर उपयोगकर्ता
sadaau

7

इस समस्या का ffmpeg समाधान कुछ इस तरह दिखता है:

mkfifo temp1 temp2 temp3
ffmpeg -i input.wmv -ss 30 -to 60 -c copy output.wmv temp1 2> /dev/null & \
ffmpeg -i input2.wmv -t 60 -c copy temp2 2> /dev/null & \
ffmpeg -i input3.wmv -i image.png -filter_complex "[0:v][1:v] \
overlay=25:25:enable='between(t,0,20)'" -pix_fmt yuv420p -c:a copy temp3 2> /dev/null & \
ffmpeg -f mpegts -i "concat:temp1|temp2|temp3" -c copy output.mp4

यह नामित पाइपों का उपयोग करता है, इसलिए डिस्क पर कोई अस्थायी फ़ाइल नहीं है, और आपको वीडियो क्लिप के विखंडन को काटने और छवियों को जोड़ने की अनुमति देता है।

यह उदाहरण पहले इनपुट के 30-60 समय का उपयोग करता है, और फिर दूसरे इनपुट के पहले मिनट को जोड़ता है, फिर एक छवि फ़ाइल सम्मिलित करता है, और फिर पूरे तीसरे वीडियो।

से उठाया गया कोड:

ffmpeg concatenate पेज: https://trac.ffmpeg.org/wiki/Concatenate

सुपरसुअर पेज वीडियो को काटने के लिए ffmpeg का उपयोग करना

सुपरयुसर पृष्ठ https://video.stackexchange.com/questions/12105/add-an-image-in-front-of-video-use-ffmpeg


इसके लिए धन्यवाद, मैंने हाल ही में ffmpeg-concat के बारे में भी जाना , जो जावास्क्रिप्ट में लिखा गया है (और आपको npmइसे स्थापित करने की आवश्यकता है), इसलिए मैंने सोचा कि मैं इसका उल्लेख
करूंगा

4

मैं भी इस तरह के एक उपकरण की तलाश में हूं और यह प्रतीत होता है कि पिघल काम के लिए उपकरण है, हालांकि प्रलेखन को समझना या गायब करना लगभग असंभव है। आप संपादन का लगभग कोई भी संयोजन कर सकते हैं। मेरे पास कुछ 'एक्शन कैम' फुटेज थे ... हालांकि ध्वनि अनुपयोगी थी। मैंने (h264) वीडियो को एक साथ जोड़ा, एक 60 फ्रेम फीका जोड़ा और एक साउंड ट्रैक के साथ ध्वनि का उपयोग किया:

% melt -video-track vid1.avi vid2.avi -mix 60 -mixer luma vid3.avi \
   -mix 60 -mixer luma -audio-track vorbis:track1.ogg vorbis:track2.ogg \
   -consumer avformat:OUT.avi acodec=libmp3lame vcodec=libx264

आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं । मुख्य वेबसाइट यहाँ है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.