来自 S3 存储桶的 Spring Boot 视频流

Ami*_*mit 5 amazon-s3 video-streaming amazon-web-services spring-boot amazon-kinesis-video-streams

我想创建一个类似 YouTube 的视频流应用程序,但规模较小。我使用 Spring boot 作为后端休息端点,使用 amazon S3 存储桶来存储视频文件。我能够将视频文件上传和下载到 S3 存储桶。但我对流媒体方面感到困惑。我想在jsp页面中显示这些视频文件来播放。我听说过 Aws 视频点播、aws kinesis 等。有人可以建议我或分享一些链接,这将是使用 Spring Boot 进行视频流的最佳方法。或者除了 aws 服务之外还有其他服务在这种情况下有用吗?我完全困惑了。请帮帮我。谢谢。

dev*_*rsh 2

我创建了一个示例项目,用于使用 Spring Boot 流式传输 AWS s3 资源。

您可以根据需要设置带有映射的控制器。

对于此演示代码,端点是http://localhost:port/bucket_name/object_key

    @RestController("/")
    public class ApiController {

    @Value("${aws.region}")
    private String awsRegion;

    @GetMapping(value = "/**", produces = { MediaType.APPLICATION_OCTET_STREAM_VALUE })
    public ResponseEntity<StreamingResponseBody> getObject(HttpServletRequest request) {
        try {
            AmazonS3 s3client = AmazonS3ClientBuilder.standard().withRegion(awsRegion).build();

            String uri = request.getRequestURI();
            String uriParts[] = uri.split("/", 2)[1].split("/", 2);
            String bucket = uriParts[0];
            String key = uriParts[1];
            System.out.println("Fetching " + uri);
            S3Object object = s3client.getObject(bucket, key);
            S3ObjectInputStream finalObject = object.getObjectContent();

            final StreamingResponseBody body = outputStream -> {
                int numberOfBytesToWrite = 0;
                byte[] data = new byte[1024];
                while ((numberOfBytesToWrite = finalObject.read(data, 0, data.length)) != -1) {
                    outputStream.write(data, 0, numberOfBytesToWrite);
                }   
                finalObject.close();
            };
            return new ResponseEntity<StreamingResponseBody>(body, HttpStatus.OK);
        } catch (Exception e) {
            System.err.println("Error "+ e.getMessage());
            return new ResponseEntity<StreamingResponseBody>(HttpStatus.BAD_REQUEST);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

您需要在 ResponseEntity 中使用 StreamingResponseBody。如果您需要一个随时可用的微服务,请随意探索我出于相同目的而编写的github 项目s3-streamer 。