如何在Android App中播放来自Amazon S3的视频?

时间:2012-11-08 10:32:11

标签: android video amazon-s3 amazon-web-services bytearrayoutputstream

我使用aws-android-sdk-1.4.3/samples/S3_SimpleDB_SNS_SQS_Demo预览存储在亚马逊(Amazon Simple Storage Service)上的文件。通过代码我看到他们使用它来访问文件:

com.amazonaws.demo.s3.S3.getDataForObject (line 130)

 public static String getDataForObject( String bucketName, String objectName ) {
        return read( getInstance().getObject( bucketName, objectName ).getObjectContent() );
    }


protected static String read( InputStream stream ) {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream( 8196 );
        byte[] buffer = new byte[1024];
        int length = 0;
        while ( ( length = stream.read( buffer ) ) > 0 ) {
            baos.write( buffer, 0, length );
        }

        return baos.toString();
    }
    catch ( Exception exception ) {
        return exception.getMessage();

    }
}

}

好吧,我已修改此方法以返回ByteArrayOutputStream,然后我轻松将其转换为StringBitmap(应用ByteArrayOutputStream.toByteArray()然后使用 BitmapFactory.decodeByteArray(byte[] data, int offset, int length, Options opts))。

因此,它适用于文本文件和图片。我的问题是当我尝试访问视频时。所以,我的问题是:

1.使用上面提供的方法,我如何从ByteArrayOutputStreamByteArrayOutputStream.toString())获取视频,并使用VideoView或使用MediaPlayer或方法播放视频......?

2。有没有人知道亚马逊上存储的预览视频这个问题的其他解决方案? (我听说他们sdk IOS他们使用网址来访问文件......)

PS:提供文件URL并在浏览器中打开它没有意义,因为这个URL在wile之后到期。

3 个答案:

答案 0 :(得分:7)

首先,我们必须提供我们的存储桶的名称和我们想要打开的对象(请参阅aws-android-sdk-1.4.3/samples/S3_SimpleDB_SNS_SQS_Demo获取完整的指南),然后获取对象的URL:

    AWSCredentials myCredentials = new BasicAWSCredentials("YOUR_AMAZON_ACCESS_KEY_ID", "YOUR_AMAZON_SECRET_KEY_ID");
    AmazonS3 s3client = new AmazonS3Client(myCredentials);
    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName);
    URL objectURL = s3client.generatePresignedUrl(request);

现在,只需在视频视图中播放视频,然后提供获得的网址:

    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    mediaCtrl = new MediaController(this);
    mediaCtrl.setMediaPlayer(videoView);
    videoView.setMediaController(mediaCtrl);
    Uri clip = Uri.parse(objectURL.toString());
    videoView.setVideoURI(clip);
    videoView.requestFocus();
    videoView.start();

我要感谢@CommonsWare

答案 1 :(得分:3)

  

1.使用上面提供的方法,如何从ByteArrayOutputStream(ByteArrayOutputStream.toString())获取视频并在VideoView中播放或使用MediaPlayer或方法...?

也许你可以通过ContentProvideropenFile()发布字节数组来实现它。 Here is a sample project我通过这种方式通过自定义InputStream演示文件服务。

媒体子系统相当繁琐,所以我不会给你很好的机会。

  

2。有没有人知道亚马逊上存储的预览视频这个问题的其他解决方案? (我听说他们在IOS上使用URL来访问文件......)

最后我检查过,S3有一个REST API,可用于生成视频的URL。我将该网址提交给MediaPlayerVideoView

  

提供文件URL并在浏览器中打开它没有意义,因为这个URL在wile之后到期。

但是你可以控制“诡计多久”。让它成为24小时或其他什么。

答案 2 :(得分:0)

@AlexAndro回答

n

解决了我的问题,但需要定义您的区域 使用

const countUp = (n) =>
  n < 1 
    ? [] 
    : countUp(n - 1).concat(n)

const countUp = (n) => n < 1 ? [] : [...countUp(n - 1), n] 用于AWSCredentials myCredentials = new BasicAWSCredentials("YOUR_AMAZON_ACCESS_KEY_ID", "YOUR_AMAZON_SECRET_KEY_ID"); AmazonS3 s3client = new AmazonS3Client(myCredentials); GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName); URL objectURL = s3client.generatePresignedUrl(request); getWindow().setFormat(PixelFormat.TRANSLUCENT); mediaCtrl = new MediaController(this); mediaCtrl.setMediaPlayer(videoView); videoView.setMediaController(mediaCtrl); Uri clip = Uri.parse(objectURL.toString()); videoView.setVideoURI(clip); videoView.requestFocus(); videoView.start();

在这里您可以找到所有regions