2016-01-02 3 views
8

Я хочу передать большие видеофайлы из AWS S3 в Popen's stdin, что с точки зрения Python является «файлоподобным объектом». Этот код работает как функция AWS Lambda, поэтому эти файлы не будут вписываться в память или в локальную файловую систему. Кроме того, я не хочу копировать эти огромные файлы в любом месте, я просто хочу потоковое преобразование, процесс «на лету» и поток потока. У меня уже есть обрабатывающие и потоковые выходные биты. Проблема заключается в том, как получить входной поток как Popen pipe.Как использовать botocore.response.StreamingBody как stdin 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'] 

body является botocore.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

См. Мой ответ в этой теме [thread] (https://stackoverflow.com/questions/7624900/how-can-i-use-boto-to-stream-a-file-out-of-amazon-s3 -в-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() загружает все видео (сотни МБ) в оперативную память. Мне нужно передать его, вдыхая кусок за раз. –

+1

@MikeSlinn 'StreamingBody.read (amt = chunk_size)' позволяет обрабатывать байты chunk_size –

+1

Я собрал короткую программу (https://github.com/) mslinn/pvideoShared2), который вызывает 'StreamingBody.read (amt = chunk_size)' из другого потока. Он читает 1/3 входного файла (видео mp4) и застревает, возможно, потому, что потребитель данных (ffmpeg), который работает на исходном потоке, фактически не запускается. Может быть, его буфер STDIN заполняется, и весь беспорядок останавливается? –