2016-01-02 15 views
8

Tôi muốn đặt các tệp video lớn từ AWS S3 vào 's stdin, từ quan điểm của Python là một' đối tượng giống như tệp '. Mã này chạy dưới dạng hàm AWS Lambda, vì vậy các tệp này sẽ không vừa trong bộ nhớ hoặc trên hệ thống tệp cục bộ. Ngoài ra, tôi không muốn sao chép các tệp khổng lồ này ở bất kỳ đâu, tôi chỉ muốn truyền luồng dữ liệu đầu vào, quá trình khi đang di chuyển và phát trực tiếp đầu ra. Tôi đã có các bit xử lý và đầu ra luồng hoạt động. Vấn đề là làm thế nào để có được một dòng đầu vào như là một Popen pipe.Làm thế nào để sử dụng botocore.response.StreamingBody như stdin PIPE

Cập nhật: Tôi đặt cùng một số short program gọi StreamingBody.read (amt = chunk_size) dựa trên nhận xét. Chương trình đọc một số tập tin đầu vào (một video mp4) và bị kẹt, có thể bởi vì người tiêu dùng dữ liệu (ffmpeg) không thực sự chạy, hoặc có thể đệm STDIN của nó và toàn bộ đống lộn xộn sẽ dừng lại?

tôi có thể truy cập vào một tập tin trong một xô S3:

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

body là một botocore.response.StreamingBody mà trông như thế này:

{ 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'}}

Tôi có ý định sử dụng body một cái gì đó như thế này:

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

Nhưng tất nhiên body cần phải được chuyển đổi thành một đối tượng giống như tệp. Câu hỏi là thế nào?

+0

Xem phản hồi của tôi trong [thread] có liên quan này (https://stackoverflow.com/questions/7624900/how-can-i-use-boto-to-stream-a-file-out-of-amazon-s3 -to-rackspace-cloudfiles /). – smallo

+0

Xem câu trả lời của tôi cho [thread] liên quan này (https://stackoverflow.com/questions/7624900/how-can-i-use-boto-to-stream-a-file-out-of-amazon-s3-to -rackspace-cloudfiles /). – smallo

Trả lời

7

Để đọc dữ liệu nhị phân từ sử dụng StreamingBody StreamBody.read(). Bạn nhận được một chuỗi nhị phân.

+2

Gọi đọc() tải toàn bộ video (hàng trăm MB) vào RAM. Tôi cần stream nó bằng cách hít một đoạn tại một thời điểm –

+1

@MikeSlinn 'StreamingBody.read (amt = chunk_size)' cho phép bạn xử lý 'chunk_size' bytes –

+1

Tôi đặt cùng một [chương trình ngắn] (https://github.com/ mslinn/pvideoShared2) gọi 'StreamingBody.read (amt = chunk_size)' từ một chuỗi khác. Nó đọc 1/3 của tập tin đầu vào (một video mp4) và bị mắc kẹt, có thể bởi vì người tiêu dùng của dữ liệu (ffmpeg), chạy trên chủ đề ban đầu, không thực sự chạy. Có lẽ bộ đệm STDIN của nó sẽ lấp đầy và cả đống lộn xộn sẽ dừng lại? –

Các vấn đề liên quan