2016-01-02 58 views
8

我想從AWS S3管大的視頻文件轉換成Popenstdin,這是從Python的角度來看一個‘類文件對象’。此代碼作爲AWS Lambda函數運行,因此這些文件不適合內存或本地文件系統。另外,我不想在任何地方複製這些龐大的文件,我只想流式輸入,即時處理,並輸出流。我已經有處理和流輸出位工作。問題是如何獲得輸入流爲Popen pipe如何使用botocore.response.StreamingBody作爲標準輸入PIPE

更新:我把一個short program放在一起,根據評論調用StreamingBody.read(amt = chunk_size)。該程序讀取一些輸入文件(mp4視頻)並卡住,可能是因爲數據使用者(ffmpeg)沒有真正運行,或者其STDIN緩衝區已滿並且整個混亂都停止了?

我可以在一個S3桶訪問一個文件:

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

bodybotocore.response.StreamingBody它看起來像這樣:

{ 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是這樣的:

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 -to-Rackspace公司-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

對於從StreamingBody中讀取二進制數據,使用StreamBody.read()。你得到一個二進制字符串。

+2

調用read()會將整個視頻(數百MB)加載到RAM中。我需要通過一次吸入一個塊來流式傳輸 –

+1

@MikeSlinn'StreamingBody.read(amt = chunk_size)'可以處理'chunk_size'字節 –

+1

我把一個[簡短程序](https://github.com/ mslinn/pvideoShared2)從另一個線程調用'StreamingBody.read(amt = chunk_size)'。它讀取輸入文件(一個mp4視頻)的三分之一併被卡住,可能是因爲在原始線程上運行的數據使用者(ffmpeg)實際上沒有運行。也許它的STDIN緩衝區填滿了整個混亂局面? –

相關問題