मैं आमतौर पर निम्नलिखित स्थिति में समाप्त होता हूं: मेरे पास एक कैमरा से 650 एमबी एमपीईजी -2 .avi वीडियो फ़ाइल है। फिर, मैं ffmpeg2theora का उपयोग थियोरा .ogv वीडियो फ़ाइल में कनवर्ट करने के लिए करता हूं, आकार में लगभग 150 एमबी कहता हूं। अंत में, मैं इस .ogv फ़ाइल को ssh
सर्वर पर अपलोड करना चाहता हूं।लिनक्स: अधूरा फाइल अपलोड करना - फ़ाइल आकार की जांच (एसपीपी/आरएसआईएनसीसी)
मान लें, ffmpeg2theora
एन्कोडिंग प्रक्रिया में मेरे पीसी पर कुछ 15 मिनट लगते हैं। दूसरी ओर, अपलोड लगभग 60 केबी/एस की गति के साथ चलता है, जिसमें कुछ 45 मिनट लगते हैं (150 एमबी .ogv के लिए)। तो: अगर मैं पहले एनकोड, और एन्कोडिंग प्रक्रिया को समाप्त करने के लिए प्रतीक्षा - और फिर अपलोड इसमें लगभग
15 min + 45 min = 1 hr
लेने कार्य को पूरा करने हैं।
तो, मैंने सोचा कि अगर मैं किसी भी तरह से अपलोड शुरू कर सकता हूं तो यह बेहतर होगा, समानांतर में एन्कोडिंग ऑपरेशन के साथ; फिर, सैद्धांतिक रूप से - अपलोडिंग प्रक्रिया धीमी होती है (स्थानांतरित बाइट्स/सेक के अनुसार) एन्कोडिंग एक (जेनरेट बाइट्स/सेक के संदर्भ में) - अपलोड करने की प्रक्रिया हमेशा एन्कोडिंग के पीछे "पीछे" होती है , और इसलिए पूरे ऑपरेशन (एनक + अप्ली) केवल 45 मिनट में पूरा हो जाएगा (यानी, केवल अपलोड प्रक्रिया का समय +/- तार पर वास्तविक अपलोड गति स्थिति के आधार पर कुछ मिनट)।
मेरे पहले विचार पाइप को ffmpeg2theora
के उत्पादन tee
(इतनी के रूप में .ogv की स्थानीय प्रतिलिपि रखने के लिए) के लिए, उत्पादन आगे ssh
लिए किया गया था और उसके बाद पाइप - के रूप में:
./ffmpeg2theora-0.27.linux32.bin -v 8 -a 3 -o /dev/stdout MVI.AVI | tee MVI.ogv | ssh [email protected] "cat > ~/myvids/MVI.ogv"
हालांकि यह आदेश वास्तव में कार्य करता है - ffmpeg2theora
से टर्मिनल में चल रहे लॉग में आसानी से देख सकता है, इस मामले में, ffmpeg2theora
1 घंटे होने के अनुमानित समय की गणना करता है; ऐसा लगता है कि कोई दोनों एनक + अप्ल के लिए छोटे समापन समय के संदर्भ में लाभ होता है। (हालांकि यह संभव है कि यह नेटवर्क की भीड़ के कारण है, और मुझे उस समय नेटवर्क की गति कम हो रही है - ऐसा लगता है कि ffmpeg2theora
को पाइप के माध्यम से भेजे गए डेटा के प्रत्येक छोटे हिस्से के लिए एक पावती की प्रतीक्षा करनी है , और एसीके को अंततः ssh
से आना है ... अन्यथा, ffmpeg2theora
पूरा करने का समय अनुमान प्रदान करने में सक्षम नहीं होता। फिर फिर, अनुमान गलत है, जबकि ऑपरेशन वास्तव में 45 मिनट में पूरा होगा - डुनो, कभी नहीं प्रतीक्षा करें और समय की प्रक्रिया के लिए धैर्य था, मैं सिर्फ 1 ghante अनुमान के रूप में कम से नाराज मिलता है, और Ctrl-C मारा;) ...)
मेरे दूसरा प्रयास एक टर्मिनल विंडो में एन्कोडिंग प्रक्रिया चलाने के लिए किया गया था, यानी:
./ffmpeg2theora-0.27.linux32.bin -v 8 -a 3 MVI.AVI # MVI.ogv is auto name for output
..., और अपलोड करने की प्रक्रिया, एक और टर्मिनल विंडो में, scp
का उपयोग कर (जिससे 'बनता है' 'के लिए मजबूर'):
scp MVI.ogv [email protected]:~/myvids/
समस्या यहाँ है: मान लें, समय जब scp
प्रारंभ होता है, ffmpeg2theora
पहले से ही आउटपुट .ogv फ़ाइल के 5 एमबी एन्कोड किया गया है। इस समय, scp
इस 5 एमबी को पूरे फ़ाइल आकार के रूप में देखता है, और अपलोड करना शुरू करता है - और जब यह 5 एमबी चिह्न से मुकाबला करता है तो यह निकलता है; जबकि इस दौरान, ffmpeg2theora
ने 15 एमबी अतिरिक्त उत्पादन किया हो सकता है।ओजीवी फ़ाइल कुल आकार में 20 एमबी scp
पर बाहर निकल गया है (पहले 5 एमबी के हस्तांतरण को समाप्त कर रहा है)।
तब मैं आंशिक रूप से पूरा अपलोड की (joen.dk » Tip: scp Resume) कि rsync
का समर्थन करता है 'फिर से शुरू', सीखा के रूप में:
rsync --partial --progress myFile remoteMachine:dirToPutIn/
..., तो मैं rsync
बजाय scp
उपयोग करने की कोशिश - लेकिन यह वास्तव में व्यवहार करने के लिए लगता है फ़ाइल आकार के संदर्भ में scp
जैसा ही है, यह है: यह केवल प्रक्रिया की शुरुआत में पढ़ने वाले फ़ाइल आकार में स्थानांतरित होगा, और फिर यह बाहर निकल जाएगा।
तो, मेरे प्रश्न समुदाय में है: क्या एन्कोडिंग और अपलोडिंग प्रक्रिया को समानांतर करने का कोई तरीका है, ताकि कुल प्रोसेसिंग समय में कमी प्राप्त हो सके?
मैं वहाँ अनुमान लगा रहा हूँ के रूप में कई तरीके हो सकते हैं:
- एक आदेश पंक्ति विकल्प (जो मैंने नहीं देखा है) कि बलों
scp
/rsync
लगातार फ़ाइल आकार की जाँच करने के - यदि फाइल एक और प्रक्रिया () द्वारा लिखने के लिए खुला है, तो मैं बस एक और टर्मिनल विंडो में अपलोड चला सकता हूं) - एक बैश स्क्रिप्ट;
rsync --partial
while
लूप में चल रहा है, जो तब तक चलता है जब तक .ogv फ़ाइल किसी अन्य प्रक्रिया द्वारा लिखने के लिए खुली होती है (मुझे वास्तव में यह समाधान पसंद नहीं है, क्योंकि मैं फिर से शुरू करने के लिए हार्डडिस्क स्कैनिंग सुन सकता हूं, हर बार जब मैं चलानेrsync --partial
- जो, मुझे लगता है, अच्छा नहीं हो सकता है, अगर मुझे पता है कि एक ही फाइल एक ही समय) - एक अलग उपकरण (अलावा अन्य पर करने के लिए लिखा जा रहा है
scp
/rsync
) इस बात का एक "वर्तमान में समर्थन अपलोड करता है जेनरेट की गई "/" अधूरा "फ़ाइल (धारणा है कि यह केवल बढ़ती फाइलों को संभाल सकता है; अगर यह मुठभेड़ करता है कि स्थानीय फ़ाइल अचानक आकार में कम है, तो पहले से ही स्थानांतरित बाइट्स की तुलना में आकार में कम है)
... लेकिन यह भी हो सकता है कि मैं कुछ दिख रहा हूं - और 1hr उतना अच्छा है जितना इसे प्राप्त होता है (दूसरे शब्दों में, यह 45 मिनट कुल समय प्राप्त करने के लिए तर्कसंगत रूप से असंभव है - भले ही समानांतर करने की कोशिश) :)
ठीक है, मैं टिप्पणी है कि होता है, उम्मीद है कि, यह मेरे लिए स्पष्ट करने के लिए तत्पर हैं;)
अग्रिम धन्यवाद,
चीयर्स!
सुझाव के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि इसके बजाय फाइल सिस्टम का उपयोग करने से काफी अंतर आएगा; अनिवार्य रूप से, क्योंकि यह पाइप अनुक्रम में लगता है: 'ffmpeg2theora .. | टीई .. | ssh .. 'मूल रूप से ffmpeg2theora बनाता है जब तक एसएसएच ने एक पैकेट लिखा नहीं है; यानी, यह अभी भी प्रकृति में धारावाहिक है - और यहां तक कि अगर मैं 'ffmpeg2theora .. | के साथ प्रतिस्थापित करता हूं टीई ..>/sshfs/.. ', मुझे संदेह है कि अंतिम पाइप अभी भी" ब्रेक "करेगा (क्योंकि लेखन अभी भी नेटवर्क विलंबता से सीमित है)। मुझे लगता है कि मैं प्रक्रियाओं को समानांतर करने का एक तरीका ढूंढता हूं जैसे थ्रेड में; लेकिन मेरे अपने सी समाधान कोडिंग के बिना :) – sdaau