2016-01-02 19 views
8

Desidero convogliare file video di grandi dimensioni da AWS S3 in Popen's stdin, che è dal punto di vista di Python un 'oggetto simile a un file'. Questo codice viene eseguito come una funzione AWS Lambda, quindi questi file non si adatteranno alla memoria o al file system locale. Inoltre, non voglio copiare questi file enormi da nessuna parte, voglio solo trasmettere l'input, elaborare al volo e trasmettere l'output. Ho già elaborato i bit di output di elaborazione e streaming. Il problema è come ottenere un flusso di input come Popen pipe.Come utilizzare botocore.response.StreamingBody come stdin PIPE

Aggiornamento: ho creato uno short program che richiama StreamingBody.read (amt = chunk_size) in base a un commento. Il programma legge parte del file di input (un video mp4) e si blocca, probabilmente perché il consumatore dei dati (ffmpeg) non viene effettivamente eseguito, o forse il suo buffer STDIN si riempie e tutto il pasticcio si ferma?

posso accedere a un file in un secchio S3:

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

body è un botocore.response.StreamingBody che assomiglia a questo:

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

Ho intenzione di utilizzare body qualcosa di simile:

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

Ma ovviamente body deve essere convertito in un oggetto simile a un file. La domanda è come?

+0

Vedere la mia risposta in questa relativa [discussione] (https://stackoverflow.com/questions/7624900/how-can-i-use-boto-to-stream-a-file-out-of-amazon-s3 -per-Rackspace-cloudfiles /). – smallo

+0

Vedere la mia risposta a questo argomento [thread] (https://stackoverflow.com/questions/7624900/how-can-i-use-boto-to-stream-a-file-out-of-amazon-s3-to -rackspace-cloudfiles /). – smallo

risposta

7

Per la lettura di dati binari da StreamingBody utilizzare StreamBody.read(). Ottieni una stringa binaria.

+2

La chiamata read() carica l'intero video (centinaia di MB) nella RAM. Devo eseguire lo streaming inalando un blocco alla volta –

+1

@MikeSlinn 'StreamingBody.read (amt = chunk_size)' consente di elaborare 'chunk_size' byte –

+1

Ho messo insieme un [programma corto] (https://github.com/ mslinn/pvideoShared2) che richiama 'StreamingBody.read (amt = chunk_size)' da un altro thread. Legge 1/3 del file di input (un video mp4) e si blocca, probabilmente perché il consumatore dei dati (ffmpeg), che gira sul thread originale, non viene effettivamente eseguito. Forse il suo buffer STDIN si riempie e tutto il caos si ferma? –

Problemi correlati