如何将字节数组输入流存储为s3存储中的.wav文件

时间:2015-11-11 12:24:26

标签: scala amazon-web-services amazon-s3 bytearray

在我的scala应用程序中,我调用s3存储服务来上传我的字节数组输入流。我希望此输入流存储为.wav文件。代码如下

val bytes1 = new sun.misc.BASE64Decoder().decodeBuffer(base64String)
var fileInputStreamAudio = new ByteArrayInputStream(bytes1)
val bucketName = "Uploads"
val bucket = s3Service.createBucket(bucketName)

val fileObject = s3Service.putObject(bucket, {
                      val acl = s3Service.getBucketAcl(bucket)
                      acl.grantPermission(GroupGrantee.ALL_USERS,Permission.PERMISSION_READ)
                      val amazonPAth = UUID.randomUUID + "/audioFile.wav"
                      val tempObj = new S3Object(amazonPAth)
                      tempObj.setDataInputStream(fileInputStream)
                      tempObj.setAcl(acl)
                      tempObj.setContentType("audio/basic")
                      tempObj
                    })
                    s3AudioPath = s3Service.createUnsignedObjectUrl(bucketName, fileObject.getKey, false, false, false)

将流存储到s3存储中,没有任何错误。当我下载并播放.wav文件(我存储到s3存储的文件)时,音频没有播放。同时,当我使用文件输入流从本地磁盘上传文件时,文件将存储到s3存储中。此外,从s3下载的音频文件也没有任何错误。是否可以将字节数组存储为s3中的.wav文件?请帮我解决这个问题。提前致谢

1 个答案:

答案 0 :(得分:1)

我可以在这里想到两种可能性。该文件可能未完全上传,或者该文件缺少WAVE标头。

要检查第一种情况,请尝试在上传文件之前和之后MD5sum是否相同。

要测试第二种情况,请尝试将WAVE标头添加到文件中。在您的情况下,由于您已经有一个工作文件和一个损坏的文件,因此您可以简单地比较字节以查看头是否有问题。

有两种添加标头的方法。一种是使用AudioSystem.write。它将音频文件构造到磁盘。 下面是在磁盘上构造音频文件的示例。

 public void publishToS3(final InputStream content) throws Exception {
        File wav = null;
        try {
            wav = convertToWav(content, key.replace('/', '-'));

            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setHeader(S3Repository.HEADER_ACL, S3Repository.HEADER_ACL_VALUE);
            metadata.setContentType("audio/x-wav");

            PutObjectRequest request = new PutObjectRequest(bucketName, key, wav);
            request.setMetadata(metadata);
            LOG.info("submitting {} to {}", key, bucketName);
            s3Client.putObject(request);
            LOG.info("submitted {} to {}", key, bucketName);
        } finally {
            if (wav != null && wav.delete()) {
                LOG.info("File {} removed", wav.getName());
            }
        }
 }

 private File convertToWav(final InputStream content, final String fileName) throws IOException {
        LOG.info("Creating file {}", fileName);
        File file = File.createTempFile("datamart-extract", fileName);
        file.deleteOnExit();
        AudioInputStream source = new AudioInputStream(content, AUDIO_FORMAT, -1);
        AudioSystem.write(source, AudioFileFormat.Type.WAVE, file);
        LOG.info("successfully created file {} at {}", file.getName(), file.getAbsolutePath());
        return file;
    }

如果您不想将音频文件存储到磁盘。您将必须手动附加标题。

请参阅Wave格式http://www.topherlee.com/software/pcm-tut-wavformat.html

用于构造Wave标头的有用的库:https://code.google.com/archive/p/musicg/