如何在 Android 应用程序中播放来自 Amazon S3 的视频?

Posted

技术标签:

【中文标题】如何在 Android 应用程序中播放来自 Amazon S3 的视频?【英文标题】:How to play a video from Amazon S3 in Android App? 【发布时间】:2012-10-28 13:01:36 【问题描述】:

我使用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,然后我很容易将其转换为 StringBitmap(应用 ByteArrayOutputStream.toByteArray() 然后使用 BitmapFactory.decodeByteArray(byte[] data, int offset, int length, Options opts))。

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

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

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

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

【问题讨论】:

为什么使用(objectName)以及什么是objectName? ***.com/questions/13287233/… 【参考方案1】:

首先,我们必须提供存储桶的名称和要打开的对象(请参阅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()

playing the video is also inspired from his materials 的代码。

【讨论】:

这不会抛出 MediaPlayer: setDataSource IOException 吗?因为 url 不是 android player 可以接受的格式 @therealprashant 我现在不记得了,很久以前了:)。但是一旦你有了网址,我认为你可以根据需要对其进行格式化。 @AlexAndro 你能分享一下你用的是哪个sdk吗?使用 github.com/aws/aws-sdk-android/tree/master/aws-android-sdk-s3 不起作用 @Erum 指定版本aws-android-sdk-1.4.3 反正这很老了,我想现在还有其他方法可以使用Amazon SDK,也许使用Android Studio Gradle【参考方案2】:

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

也许您可以通过ContentProvideropenFile() 发布字节数组来使其工作。 Here is a sample project 我演示了通过这种方式自定义 InputStream 来提供文件。

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

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

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

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

但你可以控制“a wile [sic]”的长度。设置为 24 小时或其他时间。

【讨论】:

谢谢马克,我会看看你提供的两种解决方案。你知道我可以从哪里获取“S3 REST API”吗?!关于URL可用的时长,恐怕是亚马逊控制的...... @AlexAndro:“关于 URL 可用性的持续时间,恐怕它是由亚马逊控制的”——我向你保证不是。我通过 Ruby API 自己控制它,让我的书可供订阅者下载。此外,您可以在诸如 Firefox 的 S3 Explorer 之类的东西中看到限时 URL。您正在 IIRC 文档中搜索“预签名 URL”。 “你知道我可以从哪里获取“S3 REST API”吗?”——你不需要它,因为 Java API 有 generatePresignedUrl(),你可以使用它。【参考方案3】:

@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

在这里你可以找到所有regions

【讨论】:

以上是关于如何在 Android 应用程序中播放来自 Amazon S3 的视频?的主要内容,如果未能解决你的问题,请参考以下文章