2016-01-02 6 views
8

मैं Popen के stdin है, जो दृश्य एक के अजगर के दृष्टिकोण से है 'फ़ाइल जैसी वस्तु' में एडब्ल्यूएस S3 से पाइप बड़ी वीडियो फ़ाइलों को करना चाहते हैं। यह कोड AWS Lambda फ़ंक्शन के रूप में चलता है, इसलिए ये फ़ाइलें स्मृति या स्थानीय फ़ाइल सिस्टम पर फिट नहीं होंगी। साथ ही, मैं इन विशाल फ़ाइलों को कहीं भी कॉपी नहीं करना चाहता, मैं केवल इनपुट स्ट्रीम करना चाहता हूं, फ्लाई पर प्रक्रिया करना चाहता हूं, और आउटपुट स्ट्रीम करना चाहता हूं। मुझे पहले ही प्रोसेसिंग और स्ट्रीमिंग आउटपुट बिट्स मिल रही हैं। समस्या यह है कि एक इनपुट स्ट्रीम को Popen pipe के रूप में कैसे प्राप्त करें।stdin पाइप के रूप में botocore.response.StreamingBody का उपयोग कैसे करें

अपडेट: मैंने एक short program एक साथ रखा जो एक टिप्पणी के आधार पर StreamingBody.read (amt = chunk_size) को आमंत्रित करता है। कार्यक्रम कुछ इनपुट फ़ाइल (एक एमपी 4 वीडियो) पढ़ता है और संभवतः क्योंकि डेटा का उपभोक्ता (ffmpeg) वास्तव में नहीं चलता है, या शायद इसका एसटीडीआईएन बफर भरता है और पूरी गड़बड़ी बंद हो जाती है?

मैं एक S3 बाल्टी में एक फ़ाइल का उपयोग कर सकते हैं:

{ u'Body': <botocore.response.StreamingBody object at 0x00000000042EDAC8>, u'AcceptRanges': 'bytes', u'ContentType': 'video/mp4', 'ResponseMetadata': { 'HTTPStatusCode': 200, 'HostId': 'aAUs3IdkXP6vPGwauv6/USEBUWfxxVeueNnQVAm4odTkPABKUx1EbZO/iLcrBWb+ZiyqmQln4XU=', 'RequestId': '6B306488F6DFEEE9' }, u'LastModified': datetime.datetime(2015, 3, 1, 1, 32, 58, tzinfo=tzutc()), u'ContentLength': 393476644, u'ETag': '"71079d637e9f14a152170efdf73df679"', u'Metadata': {'cb-modifiedtime': 'Sun, 01 Mar 2015 01:27:52 GMT'}}

मैं इस तरह body कुछ उपयोग करने का इरादा:

import boto3 
s3 = boto3.resource('s3') 
response = s3.Object(bucket_name=bucket, key=key).get() 
body = response['Body'] 

body एक botocore.response.StreamingBody जो इस तरह दिखता है

from subprocess import Popen, PIPE 
Popen(cmd, stdin=PIPE, stdout=PIPE).communicate(input=body)[0] 

लेकिन निश्चित रूप से body को फ़ाइल की तरह ऑब्जेक्ट में परिवर्तित करने की आवश्यकता है। सवाल यह है कि कैसे?

+0

इस संबंधित [थ्रेड] में मेरी प्रतिक्रिया देखें (https://stackoverflow.com/questions/7624900/how-can-i-use-boto-to-stream-a-file-out-of-amazon-s3 करने वाली रैकस्पेस-cloudfiles /)। – smallo

+0

इस संबंधित [थ्रेड] (https://stackoverflow.com/questions/7624900/how-can-i-use-boto-to-stream-a-file-out-of-amazon-s3-to पर मेरी प्रतिक्रिया देखें -rackspace-cloudfiles /)। – smallo

उत्तर

7

स्ट्रीमिंगबॉडी से बाइनरी डेटा पढ़ने के लिए StreamBody.read() का उपयोग करें। आपको बाइनरी स्ट्रिंग मिलती है।

+2

कॉलिंग पढ़ना() पूरे वीडियो (सैकड़ों एमबी) को रैम में लोड करता है। मुझे –

+1

@MikeSlinn 'StreamingBody.read (amt = chunk_size) पर एक खंड को सांस लेने से इसे स्ट्रीम करने की आवश्यकता है, 'आपको' chunk_size' बाइट्स –

+1

'को संसाधित करने देता है, मैंने एक [लघु प्रोग्राम] (https://github.com/ mslinn/pvideoShared2) जो किसी अन्य धागे से 'StreamingBody.read (amt = chunk_size) 'को आमंत्रित करता है। यह इनपुट फ़ाइल (एक एमपी 4 वीडियो) का 1/3 पढ़ता है और संभवतः क्योंकि डेटा के उपभोक्ता (ffmpeg), जो मूल धागे पर चलता है, वास्तव में नहीं चलता है। हो सकता है कि इसका एसटीडीआईएन बफर भर जाए और पूरी गड़बड़ी बंद हो जाए? –

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