Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to play a video from Amazon S3 in Android App?

I use aws-android-sdk-1.4.3/samples/S3_SimpleDB_SNS_SQS_Demo to preview my files stored on Amazon (Amazon Simple Storage Service). Looking through code I saw that they use this, to acces the files:

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

    }
}

}

Well, I have modified this methods to return ByteArrayOutputStream instead then I easily transform it to String or Bitmap (applying ByteArrayOutputStream.toByteArray() then using BitmapFactory.decodeByteArray(byte[] data, int offset, int length, Options opts)).

So, it works on text-files and pictures. My problem is when I try to access videos. So, my questions are:

1.Using the method provided above, how could I get a video from ByteArrayOutputStream (ByteArrayOutputStream.toString()) and play it in a VideoView or using MediaPlayer or an approach... ?

2 . Does anybody know any other solution to this problem of preview videos stored on Amazon ? (I heard that on their sdk for IOS they use URLs to access files...)

PS: Supplying the file URL and open it in browser does not make sense, because this URLs expire after a wile.

like image 373
AlexAndro Avatar asked Nov 08 '12 10:11

AlexAndro


2 Answers

First we have to provide the name of our bucket and the object (see aws-android-sdk-1.4.3/samples/S3_SimpleDB_SNS_SQS_Demo for a complet guide) we want to open then get the URL to our object:

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

Now, just play the video in a video view, supplying the URL obtained:

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

I want to give thanks to @CommonsWare for

  • indicating me through REST API (even the code I used is from aws-sdk reading the REST API documentation helped me and show also other ways of requesting Amazon objects)

  • indicating me to use generatePresignedUrl()

  • the code for playing the video is also inspired from his materials.

like image 84
AlexAndro Avatar answered Oct 22 '22 07:10

AlexAndro


1.Using the method provided above, how could I get a video from ByteArrayOutputStream (ByteArrayOutputStream.toString()) and play it in a VideoView or using MediaPlayer or an approach... ?

Maybe you could get it to work by publishing the byte array through a ContentProvider and openFile(). Here is a sample project where I demonstrate serving a file by means of a custom InputStream this way.

The media subsystem is rather fussy, though, and so I do not give you good odds on this working.

2 . Does anybody know any other solution to this problem of preview videos stored on Amazon ? (I heard that on their sdk for IOS they use URLs to access files...)

Last I checked, S3 had a REST API that you could use to generate URLs to the videos. I'd hand that URL to MediaPlayer or VideoView.

Supplying the file URL and open it in browser does not make sense, because this URLs expire after a wile.

But you control how long "a wile [sic]" is. Make it be 24 hours or something.

like image 45
CommonsWare Avatar answered Oct 22 '22 08:10

CommonsWare