如何在 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
,然后我很容易将其转换为 String
或 Bitmap
(应用 ByteArrayOutputStream.toByteArray()
然后使用
BitmapFactory.decodeByteArray(byte[] data, int offset, int length, Options opts)
)。
因此,它适用于文本文件和图片。我的问题是当我尝试访问视频时。所以,我的问题是:
1.使用上面提供的方法,如何从ByteArrayOutputStream
(ByteArrayOutputStream.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 或其他方法播放...?
也许您可以通过ContentProvider
和openFile()
发布字节数组来使其工作。 Here is a sample project 我演示了通过这种方式自定义 InputStream
来提供文件。
不过,媒体子系统相当繁琐,所以我不会给你很好的机会。
2 。有人知道亚马逊上存储的预览视频问题的其他解决方案吗? (我听说在他们的 IOS sdk 上,他们使用 URL 来访问文件......)
最后我检查了一下,S3 有一个 REST API,您可以使用它来生成视频的 URL。我会将该 URL 交给MediaPlayer
或VideoView
。
提供文件 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 的视频?的主要内容,如果未能解决你的问题,请参考以下文章
如何播放来自服务器的流式 PCM 数据,如 Android AudioTrack 类?
来自 Android 设备的 Google ChromeCast 播放列表