2012-03-15 28 views
6

मैं स्क्रीन कैप्चर के लिए किसी अन्य मशीन पर ffmpeg चला रहा हूं। मैं इसे दूरस्थ रूप से रिकॉर्डिंग रोकने में सक्षम होना चाहता हूं। एफएफएमपीईजी की आवश्यकता है कि क्यू एन्कोडिंग को रोकने के लिए दबाया गया है क्योंकि इसे फ़ाइल को साफ करने के लिए कुछ अंतिम रूप देना है। मुझे पता है कि मैं इसे मार/मारने के साथ मार सकता हूं हालांकि इससे भ्रष्ट वीडियो हो सकते हैं।ffmpeg को दूरस्थ रूप से कैसे रोकें?

Press [q] to stop encoding 

मैं विशेष रूप से इस के लिए गूगल पर कुछ भी नहीं मिल सकता है, लेकिन कुछ सुझाव है कि/proc // fd/0 काम करेंगे में गूंज रहा है।

मैंने कोशिश की है लेकिन यह ffmpeg को रोक नहीं है। क्यू को टर्मिनल में दिखाया गया है जिसमें ffmpeg चल रहा है।

echo -n q > /proc/16837/fd/0 

तो मैं एक अन्य मौजूदा प्रक्रिया में एक चरित्र को इस तरह से कैसे भेज सकता हूं जैसे कि यह स्थानीय रूप से टाइप किया गया हो? या सुरक्षित रूप से ffmpeg को दूरस्थ रूप से रोकने का एक और तरीका है।

+0

ffmpeg के नए संस्करण कम से कम 'q' का उपयोग नहीं करते हैं, कम से कम उबंटू वनिरिक पर, वे कहते हैं कि उन्हें रोकने के लिए Ctrl + C दबाएं। तो एक नए संस्करण के साथ आप सिगेटरएम के बजाय उन्हें सिगिनट भेजने के लिए 'killall -INT' का उपयोग कर सकते हैं, और उन्हें साफ से बाहर निकलना चाहिए। – sashoalm

+0

@ सैटून: उबंटू का वह संस्करण संभवतः avconv (फोर्कड लीब परियोजना का हिस्सा) का उपयोग कर रहा है। उस उपयोगिता ने एक विकल्प के रूप में 'क्यू' को हटा दिया है; मुख्य एफएफएमपीईजी अभी भी है। –

+0

मुझे तब से पता चला है कि मैं ffmpeg को साफ करने के लिए kill -2 का उपयोग कर सकता हूं। हालांकि मुझे अभी भी अन्य अनुप्रयोगों में दबाए गए कुंजी को अनुकरण करने में दिलचस्पी है। – Adam

उत्तर

6

ffmpeg के नए संस्करण कम से कम 'q' का उपयोग नहीं करते हैं, कम से कम उबंटू वनिरिक पर, वे कहते हैं कि उन्हें रोकने के लिए Ctrl + C दबाएं। तो एक नए संस्करण के साथ आप सिगेटरएम के बजाय उन्हें सिगिनट भेजने के लिए 'killall -INT' का उपयोग कर सकते हैं, और उन्हें साफ से बाहर निकलना चाहिए।

+0

ffmpeg अभी हालिया गिट से संकलित अभी भी कहता है 'प्रेस रोकने के लिए [q] दबाएं। उबंटू 2015.10 के लिए वही। हालांकि, Ctrl + C भी काम करता है। –

+0

विंडोज़ बनाता है 'q' और Ctrl-C दोनों को साफ़ करने के लिए – dkrikun

12

यहां एक साफ चाल है जब मुझे इस समस्या का सामना करना पड़ा था: एक खाली फ़ाइल बनाएं (इसे नामित पाइप या कुछ भी नहीं होना चाहिए), फिर रिकॉर्डिंग रोकने का समय होने पर इसे 'q' लिखें ।

  1. $ स्पर्श रोक
  2. $ < ./stop ffmpeg -i ... output.ext>/dev/बातिल 2 >> Capture.log &
  3. $ समय रोक
  4. $ के लिए प्रतीक्षा echo 'q'>

FFmpeg टर्मिनल STDIN से 'q' प्राप्त होने पर रोकता है।

+0

अच्छा है - मेरे लिए बहुत अच्छा काम करता है! – Lukas

0

आप निष्पादन को स्वचालित करने और प्रोग्राम को रोकने के लिए "उम्मीद" का उपयोग करने का भी प्रयास कर सकते हैं। आपको screen, tmux या byobu जैसे कुछ आभासी खोल का उपयोग करना शुरू करना होगा और फिर इसके अंदर ffmpeg प्रारंभ करना होगा। इस तरह आप फिर से आभासी खोल स्क्रीन प्राप्त करने और "क्यू" विकल्प देने में सक्षम होंगे।

  1. स्थानीय या दूरस्थ रूप से वर्चुअल शैल सत्र शुरू करें, "स्क्रीन" के साथ कहें। विकल्प के साथ सत्र का नाम दें, जैसे screen -S recvideo फिर आप अपनी पसंद के रूप में ffmpeg शुरू कर सकते हैं। आप वैकल्पिक रूप से, इस सत्र से Ctrl + a + d के साथ अलग कर सकते हैं।

  2. कनेक्ट मशीन जहां ffmpeg स्क्रीन (या tmux या जो कुछ भी) के अंदर चल रहा है और इसे फिर से कनेक्ट करने के लिए: screen -d -RR recvideo और उसके बाद "q"

भेज ऐसा करने के लिए है कि एक स्क्रिप्ट के अंदर से आप तो उम्मीद कर सकते हैं का उपयोग करें, जैसे:

prompt="> " 
expect << EOF 
set timeout 20 
spawn screen -S recvideo 
expect "$prompt" 
send -- "ffmpeg xxxxx\r" 
set timeout 1 
expect eof 
EOF 

फिर, एक और पल या स्क्रिप्ट बिंदु में या किसी अन्य लिपि में तो उसे वापस:

expect << EOF 
set timeout 30 
spawn screen -d -RR recvideo 
expect "$prompt" 
send -- "q" 
expect "$prompt" 
send -- "exit\r" 
expect eof 
EOF 

आप उम्मीदों के साथ पूरे ssh सत्र को स्वचालित रूप से स्वचालित कर सकते हैं, आदेशों का अनुक्रम पारित कर सकते हैं और जो चाहते हैं उसे करने के लिए "उम्मीद" कर सकते हैं।

संबंधित मुद्दे