如何在 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 的视频?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 中播放来自 URL 的流媒体视频?

如何播放来自服务器的流式 PCM 数据,如 Android AudioTrack 类?

来自 Android 设备的 Google ChromeCast 播放列表

如何在 android 中从 url 播放动画 GIF 图像?

Android:如何停止其他活动的媒体播放器?

如何在 android 中从 react 本机应用程序播放 mov 视频?