8

aws-android-sdk-1.4.3/samples/S3_SimpleDB_SNS_SQS_Demo用来预览存储在 Amazon (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,然后我很容易将它转换为Stringor Bitmap(应用ByteArrayOutputStream.toByteArray()然后使用 BitmapFactory.decodeByteArray(byte[] data, int offset, int length, Options opts))。

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

1.使用上面提供的方法,我怎样才能从ByteArrayOutputStream( ByteArrayOutputStream.toString()) 中获取视频并以aVideoView或 usingMediaPlayer或a 方式播放...?

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

PS:提供文件 URL 并在浏览器中打开它是没有意义的,因为这个 URL 会在一段时间后过期。

4

3 回答 3

9

首先,我们必须提供存储桶的名称和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);

现在,只需在视频视图中播放视频,提供获得的 URL:

    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

  • 通过指示我REST API(即使我使用的代码来自aws-sdk阅读REST API文档也帮助了我并展示了请求亚马逊对象的其他方式)

  • 指示我使用generatePresignedUrl()

  • 播放视频的代码也受到了他的材料的启发

于 2012-11-09T10:14:14.607 回答
3

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

也许您可以通过 aContentProvider和发布字节数组来使其工作openFile()这是一个示例项目,我在其中演示了以InputStream这种方式通过自定义方式提供文件。

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

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

最后我检查了一下,S3 有一个 REST API,您可以使用它来生成视频的 URL。我会将该 URL 交给MediaPlayeror VideoView

提供文件 URL 并在浏览器中打开它是没有意义的,因为这个 URL 会在一段时间后过期。

但是你可以控制“a wile [sic]”的长度。让它成为24小时或什么的。

于 2012-11-08T11:22:09.260 回答
0

@AlexAndro 回答

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();

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

s3client.setRegion(Region.EU_Paris.toAWSRegion())

EU_Paris是为了eu-west-3

在这里您可以找到所有地区

于 2020-11-23T14:26:51.153 回答