2010-11-27 13 views
5

मैं आमतौर पर निम्नलिखित स्थिति में समाप्त होता हूं: मेरे पास एक कैमरा से 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 --partialwhile लूप में चल रहा है, जो तब तक चलता है जब तक .ogv फ़ाइल किसी अन्य प्रक्रिया द्वारा लिखने के लिए खुली होती है (मुझे वास्तव में यह समाधान पसंद नहीं है, क्योंकि मैं फिर से शुरू करने के लिए हार्डडिस्क स्कैनिंग सुन सकता हूं, हर बार जब मैं चलाने rsync --partial - जो, मुझे लगता है, अच्छा नहीं हो सकता है, अगर मुझे पता है कि एक ही फाइल एक ही समय)
  • एक अलग उपकरण (अलावा अन्य पर करने के लिए लिखा जा रहा है scp/rsync) इस बात का एक "वर्तमान में समर्थन अपलोड करता है जेनरेट की गई "/" अधूरा "फ़ाइल (धारणा है कि यह केवल बढ़ती फाइलों को संभाल सकता है; अगर यह मुठभेड़ करता है कि स्थानीय फ़ाइल अचानक आकार में कम है, तो पहले से ही स्थानांतरित बाइट्स की तुलना में आकार में कम है)

... लेकिन यह भी हो सकता है कि मैं कुछ दिख रहा हूं - और 1hr उतना अच्छा है जितना इसे प्राप्त होता है (दूसरे शब्दों में, यह 45 मिनट कुल समय प्राप्त करने के लिए तर्कसंगत रूप से असंभव है - भले ही समानांतर करने की कोशिश) :)

ठीक है, मैं टिप्पणी है कि होता है, उम्मीद है कि, यह मेरे लिए स्पष्ट करने के लिए तत्पर हैं;)

अग्रिम धन्यवाद,
चीयर्स!

उत्तर

0

क्या आप sshfs (http://fuse.sourceforge.net/sshfs.html) आज़मा सकते हैं। यह एक फ़ाइल सिस्टम होने के नाते कुछ अनुकूलन होना चाहिए हालांकि मुझे पूरा यकीन नहीं है।

+0

सुझाव के लिए धन्यवाद, लेकिन मुझे नहीं लगता कि इसके बजाय फाइल सिस्टम का उपयोग करने से काफी अंतर आएगा; अनिवार्य रूप से, क्योंकि यह पाइप अनुक्रम में लगता है: 'ffmpeg2theora .. | टीई .. | ssh .. 'मूल रूप से ffmpeg2theora बनाता है जब तक एसएसएच ने एक पैकेट लिखा नहीं है; यानी, यह अभी भी प्रकृति में धारावाहिक है - और यहां तक ​​कि अगर मैं 'ffmpeg2theora .. | के साथ प्रतिस्थापित करता हूं टीई ..>/sshfs/.. ', मुझे संदेह है कि अंतिम पाइप अभी भी" ब्रेक "करेगा (क्योंकि लेखन अभी भी नेटवर्क विलंबता से सीमित है)। मुझे लगता है कि मैं प्रक्रियाओं को समानांतर करने का एक तरीका ढूंढता हूं जैसे थ्रेड में; लेकिन मेरे अपने सी समाधान कोडिंग के बिना :) – sdaau

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