在我的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文件?请帮我解决这个问题。提前致谢
答案 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/